2010-08-06 2 views
1

J'ai une solution VB.NET, mise à niveau de la version 3.5 vers la version 4.0. Une des classes a un champ privé:FieldAccessException lorsque la classe accède à son propre champ (projet .NET mis à niveau de la version 3.5 vers la version 4.0)

Private _Projection As ICalculatedPath 

Lors de l'exécution, chaque fois que la classe contenant ce champ accède à ce champ, je reçois un FieldAccessException. La première fois que ce champ arrive à obtenir accès est un chèque null dans une méthode, et l'une des choses que je hasard essayées change la ligne ci-dessus pour:

Private _Projection As ICalculatedPath = Nothing 

Quand je fais cela, je reçois le FieldAccessException sur ce ligne indiquant que le .ctor() de la classe ne peut pas accéder à ce champ. J'ai également essayé de rendre le champ protégé et public, de nettoyer/reconstruire la solution, de redémarrer VS, de cibler x86 et .NET 4.0 spécifiquement sur chaque projet dans la solution, et d'autres mesures non sensitives pour se débarrasser de cette exception mais en vain . Ce code a bien fonctionné avant la mise à niveau, bien sûr.

Peut-être que quelque chose s'est mal passé lors du processus de mise à niveau? Je ne suis pas vraiment sûr de ce qu'il faut penser ici.

Répondre

3

Il semble que cela a à voir avec la dépréciation de Code Access Security dans .NET 4.0. L'assemblage contenant cette classe a ce qui suit dans son AssemblyInfo.vb:

<Assembly: AllowPartiallyTrustedCallers()> 

Suppression de cet attribut provoque l'FieldAccessException de ne pas se produire. Je ne sais pas exactement pourquoi c'est le cas, mais cela supprime l'exception. Si quelqu'un peut remplir plus de détails, je suis sûr qu'ils seront utiles à tous ceux qui trouveront cette question à l'avenir.

Dans notre cas, cet attribut était nécessaire car nous utilisions le contrôle MS ReportViewer avec des sources de données d'objets imbriquées. Nous n'en avons plus besoin, c'est donc une coïncidence heureuse que de s'en débarrasser n'est pas un problème.

+0

Merci beaucoup! C'était une erreur plutôt délicate. – Dmitry

0

Avez-vous également déclaré explicitement une propriété de la même classe appelée Projection? VB.NET crée automatiquement un champ privé avec un trait de soulignement principal pour toutes les propriétés automatiques que vous déclarez. Donc, si vous aviez Public Property Project As ICalculatedPath sans getters et setters déclarés (ceci est appelé une propriété automatique, qui je crois a été introduit dans VB.NET 4.0), VB.NET générera automatiquement _Projection. Dans ce cas, le programme aurait deux variables avec la même déclaration dans la même portée, ce qui serait un problème.

+0

J'ai une propriété nommée Projection, mais elle n'est pas implémentée automatiquement (juste une propriété readonly standard qui a fonctionné en 3.5). –

Questions connexes