web-dev-qa-db-fra.com

Erreur lors de l'utilisation de méthodes d'extension en C #

J'ai rencontré un problème qui me fait penser qu'il y a un bogue dans le framework 3.0. Lorsque j'essaie d'utiliser des méthodes d'extension, le message d'erreur suivant s'affiche: 

Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'

Lorsque vous utilisez ce code simple:

public static class StringUtils {
    static void TestExtension(this String targetString) {

    }
}

Le seul moyen de supprimer cette erreur de compilation consiste à ajouter le code suivant:

namespace System.Runtime.CompilerServices {
    public class ExtensionAttribute : Attribute { }
}

Cela fait quelques mois que j'ai utilisé des méthodes d'extensions, mais je suis à peu près sûr de ne pas avoir à le faire. Quelqu'un at-il rencontré ce problème?

56
Korbin

Je viens de rencontrer ce problème moi-même… .. Dans mon cas, c'est parce que j'ai converti un projet VS 2005/.Net 2.0 en un projet VS 2008/.Net 3.5. L'outil de conversion conservait les références à System.Core 2.0 et je ne trouvais pas de moyen facile de modifier les références à System.Core 3.5.

J'ai fini par recréer le projet dans VS 2008 à partir de zéro, et il a été créé avec les références appropriées à System.Core 3.5.

20
abelenky

J'ai exactement le même problème. L'erreur System.Runtime.CompilerServices.ExtensionAttribute..ctor est plutôt cryptique et peut vouloir dire plusieurs choses.

Cependant, pour moi, cela se résumait au fait que j'utilise Newtonsoft.Json.Net. J'ai supprimé la référence au fichier Newtonsoft.Json.Net20.dll et l'a ré-ajouté. Après cela, ma solution se construit à nouveau.

Le plus étrange est que lorsque j'ai essayé de découvrir ce qui était différent après cette procédure en utilisant Subversion Diff, rien ne semble avoir changé.

Donc, je ne sais vraiment pas ce que suppriment et rajoute cette référence, mais cela résout mon problème de construction avec ce message d'erreur particulier mentionné par le demandeur.

UPDATE 1:

Comme le soulignent les commentateurs, la solution appropriée pour résoudre ce problème est de télécharger le zip de Json.Net , et il devrait y avoir une version 3.5, renvoyer la référence 3.5 à chaque endroit. vous utilisez Json.Net et supprimez l'ancienne référence, car elle fait probablement référence à un assembly construit pour des versions plus anciennes de .net.

UPDATE 2:

Charlie Flowers souligne que les DLL étiquettes NewtonSoft comme étant pour la version 3.5 ne fonctionneront pas avec la version 3.5. Vous devez utiliser le DLL qu’ils étiquettent comme étant pour .net 2.0

73
7wp

dans VS, cliquez sur Projet (à côté de Fichier, Éditer, Afficher), sélectionnez Propriétés

puis dans l'onglet Application (vous remarquerez que vous êtes déjà dans la version 3.5), sélectionnez le Framework cible à 2.0, puis compilez (cela entraînera une erreur). puis remettez-le à 3.5, puis compilez à nouveau, l'erreur disparaîtra

je pense que c'est juste un petit problème dans Visual Studio, il suffit de tromper le IDE :-)

17
Michael Buen

J'avais le même problème dans un projet de bibliothèque de classes que j'avais mis à niveau de VS 2008 à VS 2010 Beta 2. Je n'avais ajouté aucune méthode d'extension au projet avant la mise à niveau, puis j'ai commencé à voir la même erreur.

L'ajout d'une classe avec le code suivant au projet a résolu le problème:

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}

J'ai trouvé le conseil sur ce blog: http://blog.flexforcefive.com/?p=105

16
Andrew Myhre

Votre infrastructure n'est pas assez élevée pour les méthodes d'extension.
C’est un bidouille pour faire fonctionner les méthodes d’extension sans être dans la version 3.5

5
Tom Ritter

Quelle version de .NET ciblez-vous? La classe ExtensionAttribute est livrée dans System.Core.dll (.NET 3.5), mais vous pouvez la déclarer à nouveau 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 ceci.

[mise à jour] Cependant, je suis un peu confus, parce que l'erreur que vous devriez voir est:

Erreur 1 Impossible de définir une nouvelle extension méthode parce que le compilateur requis type 'System.Runtime.CompilerServices.ExtensionAttribute' ne peut être trouvé. Vous manque un référence à System.Core.dll? [coupé des trucs de chemin]

3
Marc Gravell

Une référence System.Core manquante donnera ces symptômes.

2
jyoung

Ce problème est en effet dû à une référence incorrecte à la version 2 de System.Core. Cela est généralement dû à la mise à niveau d'une version antérieure de .NET vers .NET 3.5. Si vous rencontrez ce problème sur un site Web, vous pourrez y remédier en procédant comme suit:

1) Dans web.config, ajoutez une référence à System.Core v3.5:

<assemblies>
   <add Assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>

2) Dans web.config, ajoutez ce qui suit en tant qu’enfant de la configuration:

<configuration>
   <!--Some other config-->
   <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
         <assemblyIdentity name="System.Core" publicKeyToken="B77A5C561934E089"/>
         <bindingRedirect oldVersion="2.0.0.0-2.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
   </assemblyBinding>
</configuration>
1
lexx

Essayez: Projet, Ajouter une référence, recherchez System Core 3.5.0.0 dans la liste et cliquez sur OK pour l’ajouter.

0
Larry

Pour référence continue:

J'ai lutté contre ce même message d'erreur pendant les deux dernières heures dans le framework .Net 4.0 et je l'ai finalement retrouvé jusqu'à une référence corrompue à la dll Microsoft.CSharp. C'était une question tellement frustrante et simple. J'ai supprimé la référence incriminée et ajouté une "nouvelle" référence à cette dll située à l'emplacement suivant:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll

Espérons que cela permettra à quelqu'un d'autre d'économiser du temps et des difficultés pour trouver une solution à ce message d'erreur.

0
DJGray

Il suffit de cibler votre projet VS sur .NET Framework 3.5 et versions ultérieures. Très probablement, vous avez converti votre projet à partir d'une version précédente.

0
Hash

Éditez votre csproj et assurez-vous que ces références sont incluses (cela ne fonctionnera pas par simple 'ajouter une référence' ...):

<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
0
Eli Livshitz

Les extensions sont introduites en C # 3.0, contrairement à .NET 3.5. Vous ne pouvez donc pas les utiliser directement dans .NET 3.0.

0
Tamas Czinege

Est-ce un projet de site Web, par hasard? Essayez de remplacer le framework cible de .NET 3.5 par une version antérieure, puis de revenir à .NET 3.5.

0
Gabriel Isenberg

Dans mon cas, la raison était la mauvaise version NET20 de AntiXSSLibrary.dll de Microsoft. Remplacé par NET35 - l'erreur a disparu.

0
Denis

J'avais une version de Elmah.Sandbox qui ciblait .net 2.0 dans un projet existant .NET 4.0. J'ai ajouté une méthode d'extension à mon projet et la construction a échoué avec le message d'erreur "Membre manquant du compilateur requis".

La dll Elmah.Sandbox a été incluse dans une version antérieure d’ElmahR. Une fois que cela a été supprimé, tout est reconstruit.

0
Gais