57 votes

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: Manquant compilateur nécessaire de membre du Système.Moment de l'exécution.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?

73voto

7wp Points 5033

J'ai exactement le même problème. L'erreur System.Runtime.CompilerServices.ExtensionAttribute..ctor est assez mystérieux, et pourrait signifier un certain nombre de choses différentes.

Cependant, pour moi, Il est apparu le fait que je suis à l'aide d' Newtonsoft.Json.Net. J'ai supprimé la référence pour le fichier Newtonsoft.Json.Net20.dll, et la re-il ajouté. Après cela, ma solution s'appuie de nouveau.

Le 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 1:

Pour ceux qui viennent à travers ce nouveau, comme le comenters souligné, le bon moyen de résoudre ce problème consiste à 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

20voto

abelenky Points 28063

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.

17voto

Michael Buen Points 20453

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 l'IDE :-)

16voto

Andrew Myhre Points 851

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

5voto

Tom Ritter Points 44352

Votre infrastructure n'est pas assez élevée pour les méthodes d'extension.
C'est un hack pour que les méthodes d'extension fonctionnent sans être dans la version 3.5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X