Errore "Membro richiesto compilatore mancante" visualizzato più volte con quasi nessuna modifica al codice


94

Oggi dopo aver distribuito alcune modifiche a un sito MVC C # che eseguo, sono tornato per apportare altre modifiche e mi sono imbattuto in questo errore:

Membro richiesto del compilatore mancante System.Runtime.CompilerServices.ExtensionAttribute..ctor

L'errore è un po 'vago (a parte la descrizione, ovviamente) in quanto non mi fornisce un file, una riga o una colonna a cui fare riferimento, solo il progetto. Inoltre, genera l'errore per un totale di 20 volte. Ho apportato solo tre modifiche al codice tra il momento in cui l'ho distribuito (era completamente funzionante in quel momento) e ora. Ho annullato le mie modifiche e continua a presentare lo stesso errore che non ha senso per me.

Non ho trovato molte informazioni su questo errore su SO o Google, a parte questa soluzione per ragazzi e un paio di riferimenti ad alcuni errori del progetto Mono (non sto usando Mono). La soluzione fornita dal ragazzo sopra richiede l'aggiunta di una definizione di classe che consentirà al compilatore di risolvere il riferimento. Non voglio farlo in particolare perché non ho avuto bisogno di farlo fino a questo punto e rovinerà il mio codice.

Sono solo curioso di sapere se qualcuno l'ha incontrato prima. Grazie in anticipo!


1
Sembra che tu stia usando un compilatore C # 3.0 ma compilando con .NET Framework 2.0. Controlla i tuoi riferimenti di assemblaggio.
dtb

Risposte:


27

Questo errore in genere indica che il progetto è in fase di compilazione rispetto a .NET 2.0 o che non si fa riferimento alla versione corretta di System.Core.dll

Per una domanda quasi duplicata, vedere Errore durante l'utilizzo di metodi di estensione in C #


In realtà si è scoperto che avevo un cattivo riferimento da un assembly che non stavo più usando (Azure). Non credo che l'assembly di Azure sia stato compilato con .Net 2.0 ma rimuoverlo ha risolto il problema. Non sono sicuro del motivo per cui questo sia venuto in essere casualmente poiché non ho toccato nulla relativo ai miei assembly o alla versione .Net (4.0) da un po 'di tempo. Ahimè, grazie per avermi indirizzato nella giusta direzione.
jamesmillerio

Unity3D imposta il compilatore su .NET 2 per impostazione predefinita (al momento della scrittura). Nelle impostazioni del lettore, cambialo con la versione più recente di .NET per risolvere questo problema.
Shadow

230

Nel mio caso era perché il progetto non faceva riferimento Microsoft.CSharp. Una volta aggiunto un riferimento a quell'assembly, è stato compilato correttamente.


3
Problema risolto.
Anton Lyhin

16
Il mio problema era in uno Unit Test utilizzando oggetti dinamici e Expando. Fare riferimento a Microsoft.CSharp è stato il trucco. Grazie!
realPT

1
Avevo il tipo dinamico NewtonSoft ecc.Nella libreria .NetStandard Class: `` stringa weatherjson = await GetAsync (url); oggetto dinamico = JsonConvert.DeserializeObject (weatherjson); temp dinamico = obj.main.temp; `` Ho eseguito Nuget Search per Microsoft.CSharp e l'ho installato. La libreria ora viene compilata :) D. Posso usare questa libreria .NetStandard nell'app Linux, dato il riferimento Microsofct?
David Jones

Grazie! Per qualche ragione questo non era ovvio per me dal messaggio! Sto modificando un progetto scritto molto tempo fa e questa roba di riferimento è spaventosa. Fa apprezzare la relativa chiarezza di Java che utilizzo normalmente.
Sintonizzabile

82

Non so se qualcun altro lo abbia sperimentato, ma improvvisamente piove in questo errore dopo aver aggiunto del codice che utilizza i dynamictipi e incorporando WebAPI in un progetto originato come applicazione TypeScript in VS2013. La semplice aggiunta di un riferimento a Microsoft.CSharp ha risolto il mio problema.

Spero che questo aiuti qualcun altro.


3
Questo era esattamente il mio problema. L'aggiunta di dinamiche ha misteriosamente rotto il progetto.
SouthShoreAK

2
Lo stesso per me, usando dinamico con .NetStandard2.0, ho dovuto installare C # Nuget per compilare
Mahmoud Hanafy,

17

Anche oggi mi sono imbattuto in questa situazione. Nel mio caso stavo facendo riferimento a Newton.Json.Net dll v3.5 nella mia applicazione .NET 4.0. Mi sono reso conto che non stavo nemmeno usando questa libreria, quindi una volta rimossa dai miei riferimenti, non mi dava più l'errore del compilatore.

Problema risolto!!!


2
Lo stesso per me, Newton.Json.Net dll ha causato il problema!
Julien Pierre

Nel mio caso il motivo era la versione NET20 sbagliata di AntiXSSLibrary.dll di Microsoft. Sostituito con NET35: l'errore è scomparso.
Denis

7

L'errore effettivo deriva dal fatto che l'assembly 2.0 che causa l'errore contiene questo codice:

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

Il codice precedente consente all'assembly .NET 2.0 di utilizzare metodi di estensione (vedere Utilizzo di metodi di estensione in .NET 2.0? ). Anche se confonde il compilatore se si targetizza .NET 4.0 e si fa riferimento a un assembly 2.0 (contenente il codice precedente) poiché mscorlib.dll (4.0) contiene la stessa classe nello stesso spazio dei nomi.

Ho risolto questo problema

  • compilando nuovamente l'assembly 2.0 originale senza l'attributo destinato a 4.0
  • rimuovendo l'assieme (ovviamente)
  • aggiungendo un terzo attributo di estensione nella destinazione che compili (sembra sovrascrivere le definizioni di riferimento)

Questo è esattamente il mio problema, proverò le tue istruzioni e ti risponderò
John Peters

6

Scrivere questo codice da qualche parte nel tuo progetto potrebbe risolvere il tuo problema. Per me funziona

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

dove scrivi questo codice? hai creato una classe nella radice del progetto?
Alex

1
@Alex ho aggiunto una classe chiamata CompilerService alla radice del mio progetto con il codice aboce e ha funzionato. Bello!
Halvard

4

Anche NLog.dll 2.0 a cui fa riferimento un progetto .NET 4.0 può causare questo.


NLog per .NET 2.0, referenziato da .NET 3.5 sembra dare errori simili.
Pedro,

3

Probabilmente usi la dynamicparola chiave nel progetto di libreria di classi .NetStandard. In tal caso, è necessario aggiungere un riferimento alla Microsoft.CSharplibreria nel progetto. Spero che risolverà il tuo problema.


2

Non ho una soluzione corretta, ma aggiungerò il mio punto dati:

Nel mio caso l'errore è causato dal riferimento a GoogleSearchAPINet20

Ecco cosa succede:

  • Chiudo la soluzione che costruisce
  • Apro di nuovo la soluzione. Continua a costruire
  • Non appena apporto una modifica e provo a compilare, ottengo 19 errori "Membro richiesto compilatore mancante ..."
  • Rimuovo il riferimento a GoogleSearchAPINet20
  • Aggiungo nuovamente il riferimento a GoogleSearchAPINet20
  • Costruisco la soluzione. Si costruisce senza errori
  • Ora posso apportare modifiche al codice, creare o eseguire qualsiasi altra azione con la soluzione correttamente finché il mio Visual Studio è aperto
  • Chiudo Visual Studio
  • Ripeti dal primo passaggio

Non sto affatto facendo riferimento a System.Core.dll nella mia soluzione e il mio framework di destinazione è .NET 4.

Sono un po 'seccato a questo punto ...


1

Ho ricevuto questo errore durante il tentativo di utilizzare attività asincrone su .NET 4.0. L'aggiornamento di Target Framework a 4.5.2 ha risolto il problema.


1

Ho raggiunto la stessa serie di eccezioni dopo aver aggiunto alcuni metodi asincroni a un progetto winforms. Avevo bisogno di portare la mia versione .NET da 4 a 4.5


0

Per me, il problema si verifica quando aggiungo un metodo asincrono con Attività asincrona in attesa nel mio progetto .net4.0!

Con le versioni precedenti di .NET-Framework 4.5, è necessario installare questo pacchetto:

Install-package Microsoft.Bcl.Async pre

o

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

maggiori informazioni su Nuget o Nuget

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.