2010-06-14 24 views
7

tengo un problema, intento resolverlo desde ayer pero no tuve suerte. tengo 32 bit delphi dll que quiero importar en .NET Win Application. esta aplicación debe ser desarrollada en CUALQUIER modo de CPU. por supuesto, viene BadImageFormatException, lo que significa que en la aplicación x64 no se puede cargar x86 dll ... busqué en Google y encontré una solución, decía que tenía que hacer un wrapper, pero no estaba claro para mí. ¿Alguien puede decir cómo resolver este problema, hay alguna manera posible de importar 32 bits de Delphi DLL en el programa incorporado Cualquier CPU o modo x64 (tal vez otra solución).importación de 32 bits dll en 64 bit. Aplicación de red

+2

¿Por qué no compilar la aplicación .NET como x86? – OregonGhost

+2

¿Por qué tiene que compilarse como CUALQUIER CPU? Una aplicación de 32 bits se ejecutará en un sistema operativo de 64 bits. – juharr

+1

@OregonGhost Porque es el siglo XXI. – sproketboy

Respuesta

5

Una idea general podría ser envolver su DLL (no administrada) de 32 bits con un dll de contenedor administrado de 32 bits y hacer que COM sea visible. Esto permite realizar llamadas a su contenedor DLL a través de su interfaz COM.

Puede usar un sustituto COM para hacer que su dll COM aparezca como un servidor COM fuera de proceso. Eche un vistazo a esta pregunta SO para obtener más información sobre este tema: Access x86 COM from x64 .NET.

2

Según tengo entendido, no tiene forma de utilizar una DLL de 32 bits desde una aplicación de 64 bits. Dicho esto, puede compilar su aplicación solo para X86.

La solución que encontró puede ser sobre cómo usar una DLL que existe para las versiones de 32 y 64 bits en un proyecto "Any CPU", dependiendo de si la aplicación se está ejecutando en 32 o 64. entorno de bits.

Para hacer eso, podría escribir dos DLL contenedoras en C#, una para 64 bits y otra para 32 bits y usar el contenedor respectivo dependiendo de si está ejecutando un sistema operativo de 64 bits o 32 bits .

Sin embargo, esto no funciona cuando todo lo que tiene es una DLL de 32 bits. Una aplicación de 64 bits no puede usar archivos DLL de 32 bits, y una aplicación de 32 bits no puede usar archivos DLL de 64 bits.

Entonces, o necesita compilar su aplicación de 32 bits, o tiene que crear una versión de 64 bits de su DLL.

+0

En este momento, tengo solo en DLL (32 bits uno) y no hay posibilidad de tener otra DLL - versión de 64 bits, mientras tanto mi aplicación .NET debe compilarse como CUALQUIER CPU (que también considera 64 bits). Entonces, ¿no hay alguna solución para este caso? – scatterbraiin

+0

Bueno, como sugirieron Lasse V. Karlsen, puede escribir una aplicación separada de 32 bits (¡NO LA BIBLIOTECA!) Que comienza como un proceso separado y "habla" mediante la comunicación entre procesos. –

1

Una solución, aunque un poco complicada, podría ser escribir una aplicación separada de 32 bits con la que pueda hablar desde su aplicación de 64 bits, como una aplicación de consola desde la que envíe comandos a/from.

No es bonito, pero puede funcionar si solo necesita una llamada ocasional.

+0

Intenté, no exactamente así, escribí Class library, donde importé esa DLL de Delphi, compilé x86 y luego hice referencia a mi aplicación principal de 64 bits, pero todavía no tuve suerte. – scatterbraiin

+0

Porque es el mismo problema, solo que con más complejidad. ¡Tu aplicación de 64 bits tampoco puede usar una biblioteca de clases de 32 bits! Mikael hablaba de una aplicación de 32 bits con la que se comunica a través de Named Pipes u otros métodos de IPC. –

+0

Leí que es posible a través de IPC, pero a decir verdad no estaba del todo claro para mí ... ¿Hay alguna posibilidad de que tenga algunas instrucciones al respecto? Necesito más detalles, porque es realmente nuevo para mí – scatterbraiin

14

Lo que tienes que hacer es escribir una aplicación contenedora que aloja el archivo DLL de 32 bits, en un proceso de 32 bits.

Su aplicación de 64 bits tiene que hablar con este proceso de 32 bits, a través de la red o al hacer que las funciones DLL estén disponibles a través de un objeto COM o similar.

no se puede ejecutar una DLL de 32 bits dentro de un proceso de 64 bits, no importa cuánto lo intente, por lo que debe ejecutarlo en un proceso de 32 bits.

Si compilar su aplicación de 32 bits no es una opción, no tiene más remedio que crear una aplicación de host.

+0

¿Puede darme cualquier fuente? ¿Cómo puedo hacer eso? ¿O sabe dónde puede haber explicaciones detalladas? Muchas gracias – scatterbraiin

+0

Estoy bastante seguro de que una aplicación de 64 bits tampoco puede usar componentes COM de 32 bits, ¿o estoy equivocado aquí? Tuve este problema antes de usar un control COM de 32 bits y obtuve errores hasta que compilé mi proyecto C# como X86. –

+0

Desafortunadamente, esta no es una opción para mí :( – scatterbraiin

1

Simplemente compile su aplicación .Net como Platform x86. Se ejecutará en máquinas x64 y utilizará su DLL de 32 bits. No pierdas el tiempo en un contenedor.

+0

No es una opción si el sistema operativo subyacente es de 64 bits, ya que tragará las excepciones que pasan a través de la capa del sistema operativo y no las verá. – XMight

+0

¿Qué configuración mágica del sistema operativo ha soñado donde puede ejecutar una aplicación .Net de 32 bits en el sistema operativo de 64 bits, pero las excepciones son "ingeridas" ... – user7116

+2

Esto no es un sueño, pero mis condiciones de desarrollo durante varios meses. Tengo una máquina de desarrollo de 64 bits, y si compila para la plataforma x86, las excepciones se tragan (de las tareas paralelas y no solo). Visual Studio solo muestra en la ventana de salida "primera oportunidad de excepción" que obviamente no verá en la aplicación del cliente ejecutándose. Motivo: http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/ – XMight

Cuestiones relacionadas