2011-12-06 28 views
5

PresentationCore.dll y WindowsBase.dll están ambos incluidos con Microsoft .NET Framework 3.0, y dos versiones de cada archivo DLL se instalan en el disco:PresentationCore y WindowsBase dlls en ambos entornos x64 y x86

  • Un versión x64 en C: \ archivos de programa \ conjuntos de referencia \ Microsoft \ Framework \ v3.0
  • Una versión x 86 en C: \ archivos de programa (x86) \ Referencia Asambleas \ Microsoft \ Framework \ v3.0

Hasta agregar referencias a estos archivos DLL, nuestra aplicación web ASP.NET fue capaz de compilarse para "cualquier CPU" y se ejecutará en el modo de 32 bits o de 64 bits sin problemas. Después de añadir una referencia a, por ejemplo, PresentationCore a través del estándar "Agregar referencia" de diálogo (Agregar referencia -> NET -> PresentationCore), la aplicación web falla cuando está en modo de 64 bits con el siguiente error:

Could not load file or assembly 'PresentationCore' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Claramente esto se debe a que el grupo de aplicaciones de 64 bits está intentando, y en su defecto, cargar una versión de 32 bits del dll de PresentationCore.

Ahora, estoy un poco confundido por esto ...

  1. otros archivos DLL de .NET Framework parecen cambiar entre su x64 y x86 versión sin problemas (carga de Microsoft.NET/Framework64 o Microsoft.NET/Framework, respectivamente). ¿Por qué PresentationCore y WindowsBase son diferentes?
  2. ¿Por qué parece que Visual Studio solo me ofrece la versión de 32 bits en la pestaña ".NET" en el cuadro de diálogo "Agregar referencia"? Si quiero la versión de 64 bits, tengo que "buscarla".
  3. ¿Hay alguna forma simple de seleccionar automáticamente la dll correcta, como parece suceder con otras bibliotecas .NET Framework?

Siempre podemos escribir un poco de MSBuild XML que intercambiar automáticamente referencias en tiempo de construcción basado en el valor de bits del entorno de destino, pero que parece como algo que no deberíamos tener que hacer para DLL de .NET Framework. ¿Lo que da?

Gracias!

+0

¿Está seguro de que no agregó la referencia usando Examinar? ¿Has intentado eliminarlo y luego volver a agregarlo? – svick

+0

Sí, estoy seguro. Y sí, hemos intentado eliminarlo y volver a agregarlo varias veces. –

+1

Resolví este problema al habilitar "Habilitar aplicaciones de 32 bits" en la configuración avanzada del conjunto de aplicaciones. – Nippysaurus

Respuesta

3

Es posible hacer una referencia condicional de cada archivo .dll que coincida con su configuración de compilación activa. Necesitarás editar manualmente tu archivo de proyecto. Agregue una referencia a la DLL de 32 bits. A continuación, guarde el proyecto y edite el archivo .csproj en un editor de texto.

Busque la referencia que agregó y añada Condition = "$ (Platform) == 'x86'" como atributo en el elemento Reference. Luego, haga otra copia del elemento de referencia y modifíquelo para la versión x64. He aquí un ejemplo con los controladores de Oracle ODP.NET:

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64" Condition="$(Platform) == 'x64'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x64\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 
<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" Condition="$(Platform) == 'x86'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x86\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

Una cosa importante a destacar es que usted ya no será capaz de utilizar la configuración 'Cualquier CPU'. Necesitará tener configuraciones de compilación explícitas para x86 o x64. El .dll que está intentando usar probablemente haga llamadas nativas a bibliotecas de SO para que su proyecto ya no sea independiente de la plataforma.

Si solo desea mantener 1 configuración de compilación, puede ir con x86 y usar solo la versión x86/32-bit. Si se trata de una aplicación web, deberá poner el grupo de aplicaciones en el modo de 32 bits.

Editado para responder a sus qeustions originales

  • Usted tiene un puñado de opciones de plataforma cuando se genera un archivo DLL/ejecutable: Cualquier CPU, x86, x64 o Itanium. El código que está escrito al 100% en código administrado y no tiene dependencias en las bibliotecas nativas generalmente se compila en & distribuido como AnyCPU. Esto se debe a que el código de lenguaje intermedio (IL) resultante generado por el compilador puede ejecutarse en las versiones x86, x64 e Itanium de .NET Framework. Las bibliotecas que se dirigen a cualquier CPU se pueden referenciar de forma segura desde aplicaciones que son específicas de la plataforma (x86, x64, IA64). La razón por la que PresentationCore y WindowsBase son diferentes es porque tienen dependencias en el código nativo. A diferencia del código IL, que se interpreta en tiempo de ejecución, no existe el concepto de Cualquier CPU en el código nativo. Debido a las dependencias del código nativo, las bibliotecas PresentationCore y WindowsBase .NET deben distribuirse como x86 y x64, ya que AnyCPU no es posible.
  • El cuadro de diálogo Agregar referencia solo debe mostrar las bibliotecas que son compatibles con la plataforma a la que se dirige. Si su plataforma de destino es x86, solo debería mostrarle cualquier biblioteca de CPU y x86.
  • Lamentablemente, no. Si no puede usar Any CPU, pero aún necesita admitir x86 y x64, debe configurar varias configuraciones de compilación (una para x86 y otra para x64) y hacer referencia de forma condicional a las DLL de 32 y 64 bits que necesite. La única forma que conozco de hacer esto es editar el archivo del proyecto como se detalla arriba. Tendrá que crear ambas configuraciones y distribuir versiones separadas de 32 bits y 64 bits de su código también. Si alguien depende de tu código, deberán pasar por los mismos aros.
+0

Gracias por la respuesta. Ya hemos aplicado una solución a nuestro proyecto similar a la que describe aquí, pero lo que más me interesa es * por qué * tenemos que hacer esto. ¿Puedes responder alguna de las preguntas que hice? –

Cuestiones relacionadas