Erreur "Membre requis du compilateur manquant" renvoyée plusieurs fois avec pratiquement aucune modification du code

94

Aujourd'hui, après avoir déployé des modifications sur un site C # MVC que j'exécute, je suis retourné pour apporter d'autres modifications et suis tombé sur cette erreur:

Membre requis du compilateur System.Runtime.CompilerServices.ExtensionAttribute..ctor manquant

L'erreur est un peu vague (à part sa description, évidemment) car elle ne me donne pas de fichier, de ligne ou de colonne pour référencer, seulement le projet. En outre, il renvoie l'erreur un total de 20 fois. Je n'ai apporté que trois changements au code entre le moment où j'ai déployé (il était complètement fonctionnel à ce moment-là) et maintenant. J'ai annulé mes modifications et cela lance toujours la même erreur qui n'a aucun sens pour moi.

Je n'ai pas trouvé beaucoup d'informations sur cette erreur sur SO ou Google, à part cette solution de gars et quelques références à des erreurs de projet Mono (je n'utilise pas Mono). La solution que le gars ci-dessus donne nécessite l'ajout d'une définition de classe qui permettra au compilateur de résoudre la référence. Je ne veux pas particulièrement faire cela parce que je n'ai pas eu besoin de le faire jusqu'à présent et cela ne fera que brouiller mon code.

Je suis juste curieux de savoir si quelqu'un a déjà rencontré cela auparavant. Merci d'avance!

Jamesmillerio
la source
1
On dirait que vous utilisez un compilateur C # 3.0 mais que vous compilez avec .NET Framework 2.0. Vérifiez vos références d'assemblage.
dtb

Réponses:

27

Cette erreur signifie généralement que votre projet est en cours de compilation avec .NET 2.0 ou que vous ne référencez pas la version correcte de System.Core.dll

Pour une question presque en double, voir Erreur lors de l'utilisation de méthodes d'extension en C #

Robert Levy
la source
Il s'est avéré que j'avais une mauvaise référence d'un assembly que je n'utilisais plus (Azure). Je ne pense pas que l'assembly Azure a été compilé avec .Net 2.0, mais sa suppression a résolu le problème. Je ne sais pas pourquoi cela est venu au hasard car je n'ai rien touché à mes assemblys ou à la version .Net (4.0) depuis un certain temps. Hélas, merci de m'avoir orienté dans la bonne direction.
jamesmillerio
Unity3D définit le compilateur sur .NET 2 par défaut (au moment de l'écriture). Dans les paramètres du lecteur, remplacez-le par la version la plus récente.NET pour résoudre ce problème.
Shadow
230

Dans mon cas, c'était parce que le projet ne faisait pas référence Microsoft.CSharp. Une fois que j'ai ajouté une référence à cet assemblage, il s'est compilé très bien.

Mike
la source
3
Résolu le problème.
Anton Lyhin
16
Mon problème était dans un test unitaire utilisant un objet dynamique et Expando. Faire référence à Microsoft.CSharp était l'astuce. Merci!
realPT
1
J'avais le type dynamique NewtonSoft etc. Dans la bibliothèque de classes .NetStandard: `` `` string weatherjson = await GetAsync (url); obj dynamique = JsonConvert.DeserializeObject (weatherjson); temp dynamique = obj.main.temp; `` J'ai fait Nuget Search pour Microsoft.CSharp et l'ai installé. La bibliothèque se construit maintenant :) Q. Puis-je utiliser cette bibliothèque .NetStandard dans l'application Linux, compte tenu de la référence Microsofct?
David Jones
Je vous remercie! Pour une raison quelconque, ce n'était pas évident pour moi dans le message! Je peaufine un projet écrit il y a longtemps et ce truc de référence est effrayant. Fait apprécier la clarté relative de Java que j'utilise normalement.
Tuntable le
82

Je ne sais pas si quelqu'un d'autre a connu cela, mais je me plonge soudainement dans cette erreur après avoir ajouté du code utilisant des dynamictypes et incorporé WebAPI dans un projet qui a été créé en tant qu'application TypeScript dans VS2013. Le simple fait d'ajouter une référence à Microsoft.CSharp a résolu mon problème.

J'espère que ceci aide quelqu'un d'autre.

H Boyce
la source
3
C'était exactement mon problème. L'ajout de dynamique a mystérieusement brisé le projet.
SouthShoreAK
2
Idem pour moi, en utilisant dynamic avec .NetStandard2.0, j'ai dû installer C # Nuget pour qu'il se compile
Mahmoud Hanafy
17

J'ai également rencontré cette situation aujourd'hui. Dans mon cas, je faisais référence à la dll Newton.Json.Net v3.5 dans mon application .NET 4.0. J'ai réalisé que je n'utilisais même pas cette bibliothèque, donc une fois que je l'ai supprimée de mes références, cela ne m'a plus donné l'erreur du compilateur.

Problème résolu!!!

Bat_Programmer
la source
2
Pareil pour moi, Newton.Json.Net dll a causé le problème!
Julien Pierre
Dans mon cas, la raison était la mauvaise version NET20 de Microsoft AntiXSSLibrary.dll. Remplacé par NET35 - l'erreur a disparu.
Denis
7

L'erreur réelle vient du fait que votre assembly 2.0 qui provoque l'erreur contient ce code:

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

Le code ci-dessus permet à l'assembly .NET 2.0 d'utiliser des méthodes d'extension (voir Utilisation de méthodes d'extension dans .NET 2.0? ). Alors qu'il confond le compilateur si vous ciblez .NET 4.0 et référencez un Assembly 2.0 (contenant le code ci-dessus) car le mscorlib.dll (4.0) contient la même classe dans le même espace de noms.

J'ai corrigé ça

  • en compilant à nouveau l'assemblage 2.0 d'origine sans l'attribut ciblant 4.0
  • en enlevant l'ensemble (évidemment)
  • en ajoutant un troisième attribut d'extension dans la cible que vous compilez (il semble remplacer les définitions référencées)
Console
la source
C'est exactement mon problème, je vais essayer vos instructions et poster en retour.
John Peters
6

L'écriture de ce code quelque part dans votre projet peut résoudre votre problème. Ça marche pour moi

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}
Jalal Ahmadi Tabriz
la source
où écrivez-vous ce code? vous avez créé une classe à la racine du projet?
Alex
1
@Alex J'ai ajouté une classe appelée CompilerService à la racine de mon projet avec le code aboce et cela a fonctionné. Agréable!
Halvard
4

NLog.dll 2.0 référencé à partir d'un projet .NET 4.0 peut également provoquer ce problème.

fromage
la source
NLog pour .NET 2.0, référencé à partir d'un .NET 3.5 semble donner des erreurs similaires.
Pedro
3

Vous utilisez probablement le dynamicmot clé dans le projet de bibliothèque de classes .NetStandard. Si tel est le cas, vous devez ajouter une référence à la Microsoft.CSharpbibliothèque dans le projet. J'espère que cela résoudra votre problème.

Towhidul Islam Tuhin
la source
2

Je n'ai pas de solution correcte, mais j'ajouterai mon point de données:

Dans mon cas, l'erreur est causée par le référencement de GoogleSearchAPINet20

Voici ce qui se passe:

  • Je ferme la solution qui construit
  • J'ouvre à nouveau la solution. Il construit encore
  • Dès que j'apporte une modification et que j'essaye de construire, j'obtiens 19 erreurs "Membre manquant du compilateur requis ..."
  • Je supprime la référence à GoogleSearchAPINet20
  • Je rajoute la référence à GoogleSearchAPINet20
  • Je construis la solution. Il construit sans erreurs
  • Je peux maintenant apporter des modifications au code, créer ou effectuer correctement toute autre action avec la solution tant que mon Visual Studio est ouvert
  • Je ferme Visual Studio
  • Répétez à partir de la première étape

Je ne référence pas du tout System.Core.dll dans ma solution et mon framework cible est .NET 4.

Je suis un peu ennuyé à ce stade ...

Evgeny
la source
1

Vous avez cette erreur en essayant d'utiliser des tâches asynchrones avec .NET 4.0. La mise à jour de Target Framework vers 4.5.2 a résolu le problème.

Eternal21
la source
1

J'ai frappé le même ensemble d'exceptions après avoir ajouté des méthodes asynchrones à un projet winforms. J'avais besoin de faire passer ma version .NET de 4 à 4.5

user8675309
la source
0

Pour moi, le problème se produit lorsque j'ajoute une méthode asynchrone avec async Task Wait dans mon projet .net4.0!

Avec les versions précédentes de .NET-Framework 4.5, vous devez installer ce package:

Install-package Microsoft.Bcl.Async pre

ou

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

plus d'informations sur Nuget ou Nuget

A. Morel
la source