2013-03-04 6 views
5

Stiamo facendo l'errore apparentemente comuneCompile .net progetto 4.0 sul server di build con .net 4.5

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

in un progetto che deve essere compilato contro .Net 4.0, ma è costruito su un build server in esecuzione Windows Server 2012 (con .Net 4.5). Il progetto è un'applicazione web che viene distribuita su un server Web in esecuzione nel 2003, dove l'installazione di .Net 4.5 non è un'opzione. Ci si corre contro il "classico" .Net 4.0

Da simili domande, stiamo cercando le opzioni della riga di comando per MSBuild:

/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 

Abbiamo anche provato varie combinazioni di

/property:ReferencePath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
/property:NoStdLib=true 
/property:NoCompilerStandardLib=true 

Il gli assembly di riferimento (inclusi i file .dll) sono infatti installati in quel punto sul build server. Ma quando distribuiamo il sito Web e visitiamo la home page, riceviamo quell'errore. (È interessante notare che in una pagina di ricarica l'errore scompare e il sito funziona normalmente). Quali sono i parametri MSBuild necessari per la compilazione rispetto agli assembly .Net 4.0?

Aggiornamento ho acceso la registrazione ridicolo a livello su MSBuild, e vedo che a quanto pare si sta costruendo contro le assemblee di riferimento .Net 4.0:

Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll 

e non ho visto alcuna menzione di assembly esterni a quella cartella o alla directory di lavoro del build server. Quindi sembra compilare correttamente, ma quando viene distribuito sul server web, genera un'eccezione.

Per quanto riguarda l'eccezione andando su una pagina di ricarica, mi chiedo se questo è legato alla fase di pre-compilazione del markup. Stiamo eseguendo aspnet_compile sul build server. Forse se c'è un'eccezione proveniente da un assembly generato, il web server lo ricompilerà. E l'assembly ricompilato va bene, perché è stato creato con vero .Net 4.0.

+0

Stai usando ILMerge? –

+0

Non stiamo usando ILMerge. –

+0

Rinominare C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll sul server di generazione e creare una build pulita. Troverete il progetto che utilizza gli assembly di riferimento errati. –

risposta

3

Bene, la risposta si è rivelata imbarazzante. Dopo aver confermato dall'output dettagliato di MSBuild che stava effettivamente costruendo il progetto del sito web rispetto agli assembly di riferimento giusti, ci siamo resi conto che nel progetto sono stati creati diversi pacchetti NuGet che erano stati costruiti contro .Net 4.5. Uno di questi era pieno zeppo di metodi di estensione, che è ciò che causa l'eccezione. Ricostruendoli contro .Net 4.0 risolve il problema.

Che porta a un problema interessante. Se un pacchetto NuGet di terze parti è compilato per 4.0 ma utilizzando 4.5 riferimenti, ci troveremmo nella stessa situazione, ma non siamo in grado di risolverlo. Quindi la lezione per gli editori di pacchetti è garantire che la versione 4.0 sia compilata rispetto agli assembly di riferimento.