2010-11-02 14 views
14

Quando costruisco versione x64 di mia App NET con Visual Stuido 2008 su 2003 ottengoavviso del compilatore CS1607 quando si costruisce la versione x64

avvertimento CS1607 di Windows Server: Assemblea generazione - assembly di riferimento 'mscorlib.dll' si rivolge a un processore diverso

Significa che non ho installato la versione x64 di .NET?

Report completo è qui

16> C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Csc.exe /noconfig/nowarn: 1701,1702 /Piattaforma: x64/errorreport : prompt /define: DEBUG; TRACE /reference:..........\BIN\Jfc.Dealing\Jfc.Configuration.ConfigurationLayer.dll /riferimento: ......... . \ BIN \ Jfc.Dealing \ Jfc.Sys.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\TradeProcessor\Jfc\QuikExport\bin\x64\Debug\QuikExport.dll /riferimento: D: \ Projects \ dzhukov \ SourceCode_Integration_branch \ Samples \ JFC \ FxGate \ QuoteFeedWcfRemoteControl \ bin \ x64 \ Debug \ QuoteFeedWcfRemoteControl.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /riferimento: "c: \ Programmi \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll " /riferimento:" c: \ Programmi \ Riferimento Assiemi \ Microsoft \ Framework \ v3.5 \ System.Data.DataSetExtensions.dll "/ riferimento: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Messaging.dll /reference: "C: \ Programmi \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Runtime.Serialization.dll" /riferimento: "C: \ Programmi \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.ServiceModel.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System. Xml.dll /riferimento: "c: \ Programmi \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Xml.Linq.dll" /debug +/debug: completo/filealign: 512 /out: obj \ x64 \ Debug \ FeedRawQuotes.exe /target: exe FeedRawQuotes.cs FeedRawQuotesConfiguration.cs MSMQFeed.cs Program.cs properties \ AssemblyInfo.cs avvertimento CS1607: generazione Assemblea - assembly di riferimento 'System.Data.dll ' individua un diverso avviso del processore CS1607: generazione Assembly - di riferimento assembly 'mscorlib.dll' obiettivi un processore diverso

+1

Si prega di fornire maggiori dettagli - quale versione del framework si sta costruendo contro, e su cosa stai costruendo? –

risposta

34

Questo è un avvertimento normale, si avrà sempre ottenere quando si target in modo esplicito x64. Non sarà un problema in fase di esecuzione perché su una macchina a 64 bit, il GAC memorizza una versione specifica a 64 bit di mscorlib.dll.

Versione lunga: diversi assembly .NET contengono codice non gestito. Il che li rende sensibili alla testimonianza del processo che li usa. Mscorlib.dll è uno di questi, System.Data.dll e gli assembly WPF sono altri esempi. Microsoft ha risolto questo problema costruendo due versioni di questi assembly, uno a 32 bit e uno a 64 bit. Il GAC può memorizzarli entrambi, risolti dalla proprietà AssemblyName.ProcessorArchitecture. L'impostazione "normale" per questa proprietà è MSIL, utilizzata quando l'assembly contiene IL puro. Una singola copia dell'assieme può quindi essere utilizzata sia da un processo a 32 bit sia a 64 bit.

Gli assembly di riferimento utilizzati dal compilatore sono una copia degli assembly .NET. Il compilatore li usa esclusivamente per i loro metadati. Queste copie sono tuttavia copie degli assembly a 32 bit, avranno ProcessArchitecture impostato su X86 per gli assembly che contengono codice non gestito.

Si può vedere dove va, si sta compilando per x64 e il compilatore vede un assembly di riferimento x86. Sufficiente a generare un avviso "questo programma sta funzionando solo se si fornisce anche la versione x64 dell'assembly". Che è certamente il caso degli assembly .NET, ma non necessariamente per il tuo.

Forse notabile è che questo è stato risolto in. NET 4.0. Utilizza assiemi di riferimento molto diversi, che sono memorizzati in C:\Program Files (x86)\Reference Assemblies. A differenza degli assembly di riferimento v2, sono drasticamente diversi dalla copia nel GAC. Tutto il MSIL è stato rimosso da loro, contengono solo metadati. E sono AnyCPU, quindi nessun avviso più. Lo strumento che è stato utilizzato per crearli è interessante, purtroppo Microsoft non lo condivide con noi.

Fwiw, il targeting esplicito x64 è quasi sempre la cosa sbagliata da fare. Importa solo sull'assembly EXE, poiché è quello che determina il testimone del processo. Un assembly DLL non ha scelta, l'impostazione di build appropriata per loro è Any CPU in modo che possano funzionare in entrambi i modi. La rara eccezione è che la DLL ha una dipendenza nota su un componente non gestito, in genere un server COM. Tali componenti sono in genere disponibili solo come immagini a 32 bit, si ottiene un messaggio di errore difficile da diagnosticare quando si tenta di caricarli in un processo a 64 bit ("Classe non registrata"). Forzandoli a target x86, otterresti un altro difficile da diagnosticare l'eccezione che è forse un po 'più facile per gli occhi, BadImageFormatException. Avere una dipendenza dal codice non gestito che è disponibile solo nel codice a 64 bit è piuttosto raro, pertanto il targeting x64 non ha molto senso.

Problemi correlati