Erreur lors de l'utilisation de méthodes d'extension en C#
Je suis tombé sur un problème qui me fait penser il y a un bug dans la version 3.0 du framework. Lorsque j'essaie d'utiliser des méthodes d'extension j'obtiens l'erreur suivante:
Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Lors de l'utilisation de ce code simple:
public static class StringUtils {
static void TestExtension(this String targetString) {
}
}
La seule façon de faire cette erreur de compilation aller loin est d'ajouter le code suivant:
namespace System.Runtime.CompilerServices {
public class ExtensionAttribute : Attribute { }
}
Il a été quelques mois depuis que j'utilise les extensions de méthodes, mais je suis assez sûr que je n'ai pas eu à le faire. Quelqu'un d'autre a rencontré ce problème?
- J'ai le framework cible fixée à 3,5 dans les propriétés du projet.
- Dans ce cas, je me demande si l'une des assemblées de la référence de déclarer cet attribut (avec l'aimable autorisation de mise à niveau .NET 2.0 avec C# 3.0), et le compilateur est d'avoir du mal à choisir lequel utiliser? Obtenez-vous ce problème de vanille (propre) de projet avec juste la StringUtils etc?
- (ce qui signifie: pas System.Core.dll et peut-être avec un interne constructeur)
- Connexes: Catch-22 de avec auto-défini ExtensionAttribute
- Cette erreur se produit si vous avez besoin de cibler un ancien Cadre de la version. Vous ne savez pas comment vieux, mais je l'ai eu quand j'ai eu pour cible .Net Framework 2.0. La solution ci-dessus a travaillé.
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur ce problème moi-même.
Dans mon cas, c'est parce que j'ai converti un VS 2005/.Net 2.0 VS 2008/.Net 3.5 projet. L'outil de conversion gardé les références au Système.Core 2.0, et je ne pouvais pas trouver un moyen facile de changer les références au Système.Core 3.5.
J'ai fini par re-création du projet dans VS 2008 à partir de zéro, et il a été créé avec mention de Système.Core 3.5
J'ai exactement le même problème. L'erreur
System.Runtime.CompilerServices.ExtensionAttribute..ctor
est plutôt cryptique, et pourrait signifier un certain nombre de choses différentes.Cependant, pour moi, Il est apparu le fait que je suis en utilisant
Newtonsoft.Json.Net
. J'ai supprimé la référence au fichierNewtonsoft.Json.Net20.dll
, et la re-il ajouté. Après cela, ma solution s'appuie de nouveau.La chose la plus étrange c'est que quand j'ai essayé de trouver ce qui était différent après cette procédure à l'aide de la Subversion Diff, rien ne semble avoir changé.
Donc je ne sais vraiment pas quoi enlever et rajouter cette référence n'a vraiment, mais il ne répare mon build problème avec ce message d'erreur mentionné par le demandeur.
Mise à JOUR de 1:
Pour ceux qui viennent à travers ce nouveau, comme le comenters souligné, la bonne façon de résoudre ce problème est de Télécharger Json.Net s'ZIP, et il devrait y avoir une version 3.5, re-3.5 par où vous êtes en utilisant Json.Net et supprimer l'ancienne référence, comme il est probable, faisant référence à une assemblée qui a été construit pour les versions plus anciennes de .net.
Mise à JOUR 2:
Charlie Fleurs souligne que la DLL NewtonSoft étiquettes comme pour la 3.5 est en fait ne va pas fonctionner avec la version 3.5. Vous devez utiliser la DLL elles label pour .net 2.0
The predefined type 'System.Runtime.CompilerServices.ExtensionAttribute' is defined in multiple assemblies in the global alias; using definition from 'd:\...\Newtonsoft.Json.dll'
. La mise à jour de Newtonsoft pour .NET 4.0 (qui correspondent au reste de ma solution) correction du problème.dans VS, cliquez sur le Projet (à côté de Fichier,Edition,Affichage), sélectionnez Propriétés
puis dans l'onglet Application (vous remarquerez que vous êtes déjà en 3.5), sélectionnez la Cible Cadre 2.0, puis compilez (il sera d'erreur). puis le remettre à nouveau à 3,5, puis compilez à nouveau, l'erreur disparaît
je pense que c'est juste un petit problème dans Visual Studio, tout fou le IDE 🙂
J'ai eu le même problème dans un projet de bibliothèque de classes que j'avais mis à niveau à partir de VS 2008 à visual studio 2010 Beta 2. Je n'avais pas ajouté de méthodes d'extension pour le projet jusqu'à ce qu'après la mise à niveau, puis j'ai commencé à voir la même erreur.
Ajout d'une classe avec le code suivant pour le projet a résolu le problème:
Trouvé l'astuce sur ce blog: http://blog.flexforcefive.com/?p=105
Votre cadre n'est pas assez haut pour les Méthodes d'Extension.
C'est un hack pour faire l'extension des méthodes de travail, sans être en 3,5
Quelle version de .NET vous cibler? Leextensionattribute de la classe est livré dans System.Core.dll (.NET 3.5), mais vous pouvez re-déclarer vous-même si vous souhaitez utiliser des méthodes d'extension dans .NET 2.0/3.0 (avec C# 3.0, évidemment). En fait, LINQBridge fait cela.
[mise à jour] Cependant, je suis un peu confus, parce que l'erreur que vous devrait voir est:
Un Système manquant.Base de référence de la volonté de donner à ces symptômes.
Ce problème est en effet causé par une mauvaise référence à la version 2 du Système.De base . Normalement, c'est causée lorsque la mise à niveau d'une version antérieure de .NET pour .NET 3.5 . Si c'est un site internet que vous rencontrez ce problème, alors il peut être résolu en suivant les étapes ci-dessous:
1) Dans le web.config ajouter une référence à System.De base de la v3.5:
2) Dans le web.config ajouter ce qui suit comme un enfant de configuration:
Pour les cours de référence:
J'ai lutté contre ce même message d'erreur pour les deux dernières heures dans le .Net framework 4.0 et enfin le suivi qu'il est vers le bas pour un corrompu référence à Microsoft.CSharp dll. C'était une très simple question. J'ai supprimé l'infraction de référence et l'ajout d'une "nouvelle" référence à cette dll qui a été situé à:
J'espère que cela va sauver quelqu'un d'autre le temps et de l'aggravation de rechercher une solution à ce message d'erreur.
Extensions sont introduits dans C# 3.0, qui d'autre part a été introduit en .NET 3.5, donc vous ne pouvez pas vraiment les utiliser dans .NET 3.0 directement.
Est-ce un projet de site web, par hasard? Essayez de changer la cible de cadre de .NET 3.5 à une version antérieure, et de revenir ensuite .NET 3.5.
Essayer: Projet, Ajouter une Référence, trouver du Système de Base 3.5.0.0 dans la liste, puis sur OK pour l'ajouter.
Juste cibler votre VS projet .NET framework 3.5 et au-dessus. Plus que probablement vous avez converti votre projet à partir d'une version précédente.
J'ai eu une version de Elmah.Sandbox qui a été ciblé .net 2.0 dans un existant .Net 4.0 projet. J'ai ajouté une méthode d'extension pour mon projet et de le construire a échoué avec le "Manque compilateur que les états" message d'erreur.
La Elmah.Sandbox dll a été inclus en tant que partie d'une première version de ElmahR. Une fois que cela a été supprimé, tout cela construit à nouveau.
Dans mon cas, la raison en était le mauvais NET20 version de Microsoft AntiXSSLibrary.dll. Remplacé par NET35 - l'erreur a disparu.
Modifier votre csproj et assurez-vous que ces références sont inclus (il l'habitude de travailler par simple "ajouter une référence"...):