2010-11-02 8 views
14

cuando construyo versión x64 de mi aplicación .NET con Visual Stuido 2008 sobre 2003 me saleadvertencia del compilador CS1607 cuando la construcción de la versión x64

CS1607 advertencia de Windows Server: Asamblea generación - ensamblaje de referencia 'mscorlib.dll' se dirige a un procesador diferente

¿Significa que no he instalado la versión x64 de .NET?

Informe completo está aquí

16> C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Csc.exe /noconfig/nowarn: 1701,1702 /Plataforma: x64/errorreport : prompt /define: DEBUG; TRACE /reference:..........\BIN\Jfc.Dealing\Jfc.Configuration.ConfigurationLayer.dll /reference: ......... . \ BIN \ Jfc.Dealing \ Jfc.Sys.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\TradeProcessor\Jfc\QuikExport\bin\x64\Debug\QuikExport.dll /reference: 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 /referencia: "c: \ Archivos de programa \ Referencia Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll " /reference:" c: \ Archivos de programa \ Referencia Assemblies \ Microsoft \ Framework \ v3.5 \ System.Data.DataSetExtensions.dll "/ referencia: 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 /referencia: "C: \ Archivos de programa \ Referencia Assemblies \ Microsoft \ Framework \ v3.0 \ System.Runtime.Serialization.dll" /referencia: "C: \ Archivos de programa \ Referencia Assemblies \ Microsoft \ Framework \ v3.0 \ System.ServiceModel.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System. Xml.dll /referencia: "c: \ Archivos de programa \ Referencia Assemblies \ Microsoft \ Framework \ v3.5 \ System.Xml.Linq.dll" /debug +/debug: full/filealign: 512 /out: obj \ x64 \ Debug \ FeedRawQuotes.exe /target: exe FeedRawQuotes.cs FeedRawQuotesConfiguration.cs MSMQFeed.cs Program.cs properties \ AssemblyInfo.cs advertencia CS1607: generación Asamblea - ensamblaje de referencia 'System.Data.dll ' se dirige a una advertencia de procesador diferente CS1607: generación Asamblea - Referencia montaje 'mscorlib.dll' objetivos de un procesador diferente

+1

Proporcione más detalles: ¿en qué versión del marco está generando y en qué está construyendo? –

Respuesta

34

Esta es una advertencia normal, siempre se obtendrá cuando el destino de forma explícita x64. No será un problema en el tiempo de ejecución porque en una máquina de 64 bits, el GAC almacena una versión específica de mscorlib.dll de 64 bits.

Versión larga: varios ensamblados .NET contienen código no administrado. Lo que los hace sensibles a la fragilidad del proceso que los usa. Mscorlib.dll es uno de ellos, System.Data.dll y los ensamblados de WPF son otros ejemplos. Microsoft resolvió esto creando dos versiones de esos ensamblados, uno de 32 bits y uno de 64 bits. El GAC puede almacenar ambos, resuelto por la propiedad AssemblyName.ProcessorArchitecture. La configuración 'normal' para esta propiedad es MSIL, utilizada cuando el conjunto contiene IL puro. A continuación, una copia única del ensamblaje puede ser utilizada tanto por un proceso de 32 bits como de un proceso de 64 bits.

Los ensambles de referencia utilizados por el compilador son una copia de los ensamblados .NET. El compilador los usa puramente para sus metadatos. Sin embargo, esas copias son copias de los ensamblajes de 32 bits, tendrán ProcessArchitecture establecido en X86 para los ensamblados que contienen código no administrado.

Puede ver a dónde va esto, está compilando para x64 y el compilador ve un conjunto de referencia x86. Suficiente para generar una advertencia "este programa va a funcionar solo si también proporciona la versión x64 del ensamblado". Lo cual es ciertamente el caso de los ensamblados .NET, pero no necesariamente los tuyos.

Quizás es notable que esto se resolvió en .NET 4.0. Utiliza conjuntos de referencia muy diferentes, que se almacenan en C:\Program Files (x86)\Reference Assemblies. A diferencia de los ensambles de referencia v2, son drásticamente diferentes de la copia en el GAC. Todo el MSIL fue eliminado de ellos, solo contienen metadatos. Y son AnyCPU, por lo tanto, ya no hay advertencia. La herramienta que se usó para crearlos es interesante, desafortunadamente Microsoft no la comparte con nosotros.

Fwiw, dirigirse explícitamente a x64 es casi siempre lo incorrecto. Realmente solo importa en el ensamblado EXE ya que es el que determina la bitidez del proceso. Un ensamblado de DLL no tiene otra opción, la configuración de compilación adecuada para ellos es Cualquier CPU para que puedan funcionar en ambos sentidos. La rara excepción es que el archivo DLL tiene una dependencia conocida en un componente no administrado, generalmente un servidor COM. Dichos componentes generalmente solo están disponibles como imágenes de 32 bits, se obtiene un mensaje de error difícil de diagnosticar cuando intenta cargarlos en un proceso de 64 bits ("Clase no registrada"). Al forzarlos a apuntar a x86, obtendría otra excepción difícil de diagnosticar que quizás sea un poco más sencilla: BadImageFormatException. Tener una dependencia del código no administrado que solo está disponible en el código de 64 bits es bastante raro, por lo tanto, la orientación a x64 no tiene mucho sentido.

Cuestiones relacionadas