¿Cómo soluciono el error de comstackción de Visual Studio, “falta de coincidencia entre la architecture del procesador”?

Soy nuevo en la configuración del proyecto en Visual Studio 2010, pero investigué un poco y todavía no puedo resolver este problema. Tengo una solución de Visual Studio con una DLL de C ++ que hace referencia a la DLL de C #. La DLL de C # hace referencia a algunas otras DLL, algunas dentro de mi proyecto y otras externas. Cuando bash comstackr la DLL de C ++, aparece esta advertencia:

advertencia MSB3270: Hubo una falta de coincidencia entre la architecture del procesador del proyecto que se está construyendo “MSIL” y la architecture del procesador de la referencia “[dll interna C #]”, “x86”.

Me dice que vaya a Configuration Manager para alinear mis architectures. La DLL C # está configurada con la plataforma objective x86. Si trato de cambiar esto a otra cosa, como Cualquier CPU, se queja porque una de las DLL externas de las que depende tiene una plataforma objective x86.

Cuando miro en Configuration Manager, muestra la plataforma para mi DLL de C # como x86 y para mi proyecto de C ++ como Win32. Esta parece la configuración correcta; seguramente no quiero que el proyecto de mi proyecto C ++ tenga una plataforma establecida en x64, que es la única otra opción presentada.

¿Qué estoy haciendo mal aquí?

Esta advertencia parece haberse introducido con el nuevo Visual Studio 11 Beta y .NET 4.5, aunque supongo que podría haber sido posible antes.

Primero, realmente es solo una advertencia. No debería doler nada si solo está lidiando con dependencias x86. Microsoft solo intenta advertirle cuando afirma que su proyecto es compatible con “Cualquier CPU” pero tiene una dependencia en un proyecto o ensamblado .dll que sea x86 o x64. Como tiene una dependencia x86, técnicamente su proyecto no es compatible con “Any CPU”. Para que la advertencia desaparezca, en realidad debe cambiar su proyecto de “Cualquier CPU” a “x86”. Esto es muy fácil de hacer, aquí están los pasos.

  1. Vaya a la opción del menú Build | Configuration Manager.
  2. Encuentra tu proyecto en la lista, en Plataforma dirá “Cualquier CPU”
  3. Seleccione la opción “Cualquier CPU” del menú desplegable y luego seleccione
  4. Desde ese cuadro de diálogo, seleccione x86 en el menú desplegable “Nueva plataforma” y asegúrese de que esté seleccionado “Cualquier CPU” en el menú desplegable “Copiar configuración desde”.
  5. Presione Aceptar
  6. Deberá seleccionar x86 para las configuraciones de depuración y liberación.

Esto hará que la advertencia desaparezca y también indicará que su ensamblaje o proyecto ya no es compatible con “Any CPU”, pero ahora es específico de x86. Esto también es aplicable si está construyendo un proyecto de 64 bits que tiene una dependencia x64; usted simplemente seleccionaría x64 en su lugar.

Otra nota, los proyectos pueden ser compatibles con “Cualquier CPU” por lo general si son proyectos puros de .NET. Este problema solo aparece si introduce una dependencia (dll de terceros o su propio proyecto administrado en C ++) que se dirige a una architecture de procesador específica.

Esta es una advertencia muy obstinada y si bien es una advertencia válida, hay algunos casos en los que no se puede resolver debido al uso de componentes de terceros y otras razones. Tengo un problema similar, excepto que la advertencia se debe a que mi plataforma de proyectos es AnyCPU y estoy haciendo referencia a una biblioteca de MS creada para AMD64. Esto está en Visual Studio 2010 por cierto, y parece ser introducido mediante la instalación de VS2012 y .Net 4.5.

Como no puedo cambiar la biblioteca de MS a la que me refiero, y dado que sé que mi entorno de despliegue de destino solo será de 64 bits, puedo ignorar este problema de forma segura.

¿Qué hay de la advertencia? Microsoft publicó en respuesta a un informe de Connect que una opción es desactivar esa advertencia. Solo debe hacer esto. Es muy consciente de la architecture de su solución y comprende completamente su objective de despliegue y sabe que no es realmente un problema fuera del entorno de desarrollo.

Puede editar su archivo de proyecto y agregar este grupo de propiedades y configuración para desactivar la advertencia:

  None  

Una buena regla empírica es “abrir archivos DLL, EXEs cerrados”, es decir:

  • EXE se dirige al sistema operativo, especificando x86 o x64.
  • Los archivos DLL se dejan abiertos (es decir, AnyCPU) para que puedan ser instanciados dentro de un proceso de 32 bits o de 64 bits.

Cuando construyes un EXE como AnyCPU, todo lo que estás haciendo es posponer la decisión sobre qué bitness de proceso usar para el SO, lo que JIT el EXE será de su agrado. Es decir, un sistema operativo x64 creará un proceso de 64 bits, un sistema operativo x86 creará un proceso de 32 bits.

La creación de archivos DLL como AnyCPU los hace compatibles con cualquiera de los procesos.

Para más información sobre las sutilezas de la carga de assembly, ver aquí . El resumen ejecutivo dice algo así como:

  • AnyCPU : se carga como ensamblaje x64 o x86, según el proceso de invocación
  • x86 : carga como ensamblaje x86; no se cargará desde un proceso x64
  • x64 – carga como ensamblaje x64; no se cargará desde un proceso x86

La DLL de C # está configurada con la plataforma objective x86

Cuál es el tipo de problema, una DLL realmente no puede elegir cuál será el bitness del proceso. Eso está completamente determinado por el proyecto EXE, ese es el primer ensamblaje que se carga, por lo que su configuración de destino de plataforma es la que cuenta y establece el bitness para el proceso.

Las DLL no tienen otra opción, deben ser compatibles con la bitness del proceso. Si no lo están, obtendrás un gran Kaboom con BadImageFormatException cuando tu código intente usarlos.

Entonces, una buena selección para las DLL es AnyCPU, por lo que funcionan de cualquier manera. Eso tiene mucho sentido para C # DLLs, funcionan de cualquier manera. Pero seguro, no es su DLL de modo mixto C ++ / CLI, contiene código no administrado que solo puede funcionar bien cuando el proceso se ejecuta en modo de 32 bits. Puede hacer que el sistema de comstackción genere advertencias al respecto. Que es exactamente lo que tienes. Solo advertencias, todavía se construye correctamente.

Solo despeje el problema. Establezca el objective Plataforma del proyecto EXE en x86, no funcionará con ninguna otra configuración. Y simplemente mantenga todos los proyectos DLL en AnyCPU.

Además de la respuesta de David Sacks, es posible que también deba dirigirse a la pestaña Build de las Project Properties del Project Properties y establecer el Platform Target a x86 para el proyecto que le proporciona estas advertencias. Aunque es de esperar que lo sea, esta configuración no parece estar perfectamente sincronizada con la configuración en el administrador de configuración.

Tuve este problema hoy y simplemente mirando las configuraciones de construcción en Visual Studio no estaba ayudando porque mostraba Cualquier CPU tanto para el proyecto que no estaba construyendo como para el proyecto al que se hacía referencia.

Luego miré en el csproj del proyecto al que se hace referencia y encontré esto:

  pdbonly true bin\Release\ TRACE prompt 4 x64 

De alguna manera, este PlatformTarget se agregó en medio de un cambio de configuración y el IDE no pareció verlo.

Eliminar esta línea del proyecto al que se hace referencia resolvió mi problema.

Para los proyectos de C #, el objective de x86 hace lo que parece. Dice que este ensamblaje solo admite architectures x86. Del mismo modo para x64. Cualquier CPU, por otro lado, dice que no me importa qué architecture, apoyo ambas. Entonces, las próximas 2 preguntas son (1) ¿cuál es la configuración del ejecutable que usa estos dlls? y (2) ¿cuál es la fragilidad de su sistema operativo / computadora? La razón por la que pregunto es porque si su ejecutable está comstackdo para ejecutarse en 64 bits, entonces NECESITA todas las dependencias para poder funcionar también en el modo de 64 bits. Su ensamblado Any CPU debe poder cargarse, pero quizás esté haciendo referencia a alguna otra dependencia que solo pueda ejecutarse en la configuración x86. Compruebe todas las dependencias y dependencias de dependencias para asegurarse de que todo sea “Cualquier CPU” o “x64” si planea ejecutar el ejecutable en modo de 64 bits. De lo contrario, tendrás problemas.

En muchos sentidos, Visual Studio no hace que la comstackción sea una mezcla de Any CPU y varios ensamblados dependientes de la architecture. Es factible, pero a menudo requiere que un ensamblaje que de otro modo sería “Cualquier CPU” tenga que ser comstackdo por separado para x86 y x64 porque alguna dependencia de dependencia en alguna parte tiene dos versiones.

Si su C # DLL tiene dependencias basadas en x86, entonces su DLL tendrá que ser x86. Realmente no veo una forma de evitar eso. VS se queja de cambiarlo a (por ejemplo) x64 porque un ejecutable de 64 bits no puede cargar bibliotecas de 32 bits.

Estoy un poco confundido acerca de la configuración del proyecto C ++. El mensaje de advertencia que se proporcionó para la comstackción sugiere que fue apuntado para AnyCPU, porque informó que la plataforma a la que apuntaba era [MSIL], pero indicó que la configuración para el proyecto era en realidad Win32. Una aplicación Win32 nativa no debería involucrar al MSIL, aunque es probable que necesite tener el soporte CLR habilitado si está interactuando con una biblioteca C #. Entonces creo que hay algunas lagunas en el lado de la información.

¿Podría respetuosamente pedirle que revise y publique un poco más de detalle sobre la configuración exacta de los proyectos y cómo están interrelacionados? Esté contento de ayudar aún más si es posible.

He tenido un problema similar anteriormente, específicamente al agregar una solución de prueba a una solución x64 existente, como SharePoint. En mi caso, parece tener que ver con el hecho de que ciertas plantillas de proyectos se agregan como ciertas plataformas por defecto.

Aquí está la solución que a menudo me funciona: configure todo en la plataforma correcta en Configuration Manager (el menú desplegable de configuración activa, dice Debug normalmente, es una buena forma de llegar a él) y la plataforma del proyecto (en propiedades del proyecto), luego construir, luego configurar todo a AnyCPU. A veces tengo que eliminar y volver a agregar algunas dependencias (archivos DLL en las propiedades de cada proyecto) y, a veces, se debe modificar “Ejecutar pruebas en un proceso de 32 bits o de 64 bits” (hacer doble clic en Local.testsettings e ir a Hosts).

Me parece que esto es solo establecer algo y luego volver a configurarlo, pero probablemente haya más tras bastidores que no estoy viendo. Sin embargo, funcionó de manera bastante consistente para mí en el pasado.

Para mi proyecto, tengo el requisito de poder comstackr tanto para x86 como para x64. El problema con esto es que siempre que agrega referencias mientras usa una, entonces se queja cuando construye la otra.

Mi solución es editar manualmente los archivos * .csproj para que las líneas como estas:

    

cambia a esto:

  

También puede obtener esta advertencia para ensamblajes de MS Fakes que no es tan fácil de resolver dado que el comando f.csproj está construido en el comando. Afortunadamente, Fakes xml te permite agregarlo allí .

Estaba recibiendo la misma advertencia que hice esto:

  1. descargar proyecto
  2. editar las propiedades del proyecto, es decir .csproj
  3. agregue la siguiente etiqueta:

       None   
  4. Recargar el proyecto

Debería haber una manera de hacer un .NET EXE / DLL AnyCPU, y cualquier DLL no administrada depende de comstackdo ambos con x86 y x64, ambos incluidos quizás con diferentes nombres de archivos y luego el módulo .NET carga dinámicamente el correcto en función de su tiempo de ejecución architecture del procesador Eso haría AnyCPU poderoso. Si el DLL de C ++ solo es compatible con x86 o x64, AnyCPU no tiene sentido. Pero el paquete de ambas ideas todavía no se ha implementado ya que el administrador de configuración ni siquiera proporciona un medio para construir el mismo proyecto dos veces con una configuración / plataforma diferente para agrupamiento múltiple que permita AnyCPU o incluso otros conceptos como cualquier configuración.

Tuve un problema similar causado por MS UNIT Test DLL. Mi aplicación WPF se compiló como x86 pero la DLL de prueba unitaria (archivo EXE referenciado) como “Cualquier CPU”. Cambié la DLL de prueba unitaria que se comstackría para x86 (igual que EXE) y se resolvió.

Tuve una advertencia muy similar en mi versión. Mis proyectos se configuraron para destino .NET 4.5, en el servidor de comstackción se instaló el SDK de Windows 8.1 (para .NET 4.5.1). Después de actualizar mis proyectos para alcanzar .NET 4.5.1 (no fue un problema para mí, era para una aplicación completamente nueva), ya no recibí la advertencia …

Resolví esta advertencia cambiando “Configuration Manager” a Release (Mixed Plataform).

Recibí esta advertencia en Visual Studio 2012 al comstackr una tarea de script de canalización de SSIS de SQL Server 2012 SP1, hasta que instalé SQL Server 2012 SP2.

Tuve el mismo problema con la conexión de apertura de SQLite, ¡y el uso de Nuget y la instalación del componente utilizado en el proyecto (SQLite) lo arreglaron! intente instalar su componente de esta manera y verifique el resultado