Domanda

Ho riscontrato un problema che mi fa pensare che ci sia un bug nel framework 3.0. Quando provo a utilizzare i metodi di estensione, visualizzo il seguente errore:

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

Quando si utilizza questo semplice codice:

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

    }
}

L'unico modo per eliminare questo errore di compilazione è aggiungere il seguente codice:

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

Sono passati alcuni mesi da quando ho usato i metodi di estensione, ma sono abbastanza sicuro di non doverlo fare. Qualcun altro ha riscontrato questo problema?

È stato utile?

Soluzione

Mi sono appena imbattuto in questo problema. Nel mio caso, è stato perché ho convertito un progetto VS 2005 / .Net 2.0 in un progetto VS 2008 / .Net 3.5. Lo strumento di conversione ha mantenuto i riferimenti a System.Core 2.0 e non sono riuscito a trovare un modo semplice per modificare i riferimenti a System.Core 3.5.

Ho finito per ricreare il progetto in VS 2008 da zero, ed è stato creato con riferimenti adeguati a System.Core 3.5

Altri suggerimenti

Ho lo stesso identico problema. L'errore System.Runtime.CompilerServices.ExtensionAttribute..ctor è piuttosto criptico e potrebbe significare un numero di cose diverse.

Tuttavia, per me si è ridotto al fatto che sto usando Newtonsoft.Json.Net . Ho rimosso il riferimento al file Newtonsoft.Json.Net20.dll e l'ho aggiunto di nuovo. Dopo questo la mia soluzione si ricompone.

La cosa più strana è che quando ho provato a scoprire cosa era diverso dopo questa procedura usando Subversion Diff, nulla sembra essere cambiato.

Quindi non so davvero cosa rimuova e aggiunga di nuovo questo riferimento, ma risolve il mio problema di build con questo particolare messaggio di errore citato dall'asker.

AGGIORNAMENTO 1 :

Per coloro che si imbattono di nuovo in questo, come hanno sottolineato i commenti, il modo corretto per risolvere il problema è Scarica il ZIP di Json.Net e dovrebbe esserci una versione 3.5, ri-referenziare 3.5 ogni volta che stai usando Json.Net ed eliminare il vecchio riferimento, poiché è probabile che faccia riferimento a un assembly che è stato creato per le versioni precedenti di .net.

AGGIORNAMENTO 2 :

Charlie Flowers sottolinea che le etichette DLL NewtonSoft come 3.5 per la realtà non funzioneranno con 3.5 . Devi usare la DLL che etichettano come .net 2.0

in VS, fai clic su Progetto (accanto a File, Modifica, Visualizza), seleziona Proprietà

quindi nella scheda Applicazione (noterai che sei già in 3.5), seleziona Target Framework su 2.0, quindi compila (sarà un errore). quindi rimetterlo nuovamente su 3.5, quindi compilare di nuovo, l'errore scompare

Penso che sia solo un piccolo difetto in Visual Studio, basta ingannare l'IDE :-)

Ho avuto lo stesso problema in un progetto di libreria di classi che avevo aggiornato da VS 2008 a VS 2010 Beta 2. Non avevo aggiunto alcun metodo di estensione al progetto fino a dopo l'aggiornamento, quindi ho iniziato a vedere lo stesso errore.

L'aggiunta di una classe con il seguente codice al progetto ha risolto il problema:

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

Ho trovato il suggerimento su questo blog: http://blog.flexforcefive.com/?p=105

Il tuo framework non è abbastanza alto per i metodi di estensione.
Questo è un hack per far funzionare i metodi di estensione senza essere in 3.5

Quale versione di .NET stai prendendo di mira? La classe ExtensionAttribute viene fornita in System.Core.dll (.NET 3.5), ma è possibile dichiararla nuovamente se si desidera utilizzare i metodi di estensione in .NET 2.0 / 3.0 (ovviamente con C # 3.0). In effetti, LINQBridge fa questo.

[aggiorna] Tuttavia, sono leggermente confuso, perché l'errore che dovresti è:

  

Errore 1 Impossibile definire una nuova estensione   metodo perché richiesto dal compilatore   genere   'System.Runtime.CompilerServices.ExtensionAttribute'   non può essere trovato. Ti manca un   riferimento ai   System.Core.dll? [alcuni frammenti di percorso]

Un riferimento System.Core mancante darà questi sintomi.

Questo problema è in effetti causato da un riferimento errato alla versione 2 di System.Core. Questo di solito è causato durante l'aggiornamento da una versione precedente di .NET a .NET 3.5. Se si tratta di un sito Web in cui si verifica questo problema, è possibile risolverlo attenendosi alla seguente procedura:

1) In web.config aggiungi un riferimento a System.Core v3.5:

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

2) In web.config aggiungere quanto segue come figlio della configurazione:

<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>

Per riferimento continuo:

Ho combattuto questo stesso identico messaggio di errore nelle ultime due ore nel framework .Net 4.0 e alla fine l'ho rintracciato in un riferimento danneggiato alla dll Microsoft.CSharp. Era un problema così frustrantemente semplice. Ho eliminato il riferimento offensivo e aggiunto un "nuovo" riferimento a quella dll che si trovava in:

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

Speriamo che questo salverà qualcun altro il tempo e l'aggravamento del rintracciare una soluzione a questo messaggio di errore.

Le estensioni sono introdotte in C # 3.0, che d'altra parte è stato introdotto in .NET 3.5, quindi non è possibile utilizzarle direttamente in .NET 3.0.

Questo è un progetto di un sito web, per caso? Prova a cambiare il framework di destinazione da .NET 3.5 a una versione precedente, quindi torna a .NET 3.5.

Prova: Progetto, Aggiungi riferimento, trova System Core 3.5.0.0 nell'elenco e OK per aggiungerlo.

Indirizza il tuo progetto VS a .NET framework 3.5 e versioni successive. Molto probabilmente hai convertito il tuo progetto da una versione precedente.

Avevo una versione di Elmah.Sandbox destinata a .net 2.0 in un progetto .Net 4.0 esistente. Ho aggiunto un metodo di estensione al mio progetto e la compilazione non è riuscita con il membro richiesto del compilatore mancante " messaggio di errore.

La dll Elmah.Sandbox è stata inclusa come parte di una versione precedente di ElmahR. Una volta rimosso, è stato tutto ricostruito.

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

Modifica il tuo csproj e assicurati che quei riferimenti siano inclusi (non funzionerà semplicemente con 'aggiungi riferimento' ...):

<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" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top