2008-09-24 9 views
39

Tengo una aplicación que estamos tratando de migrar a 64 bits desde 32 bits. Es .NET, compilado usando las banderas x64. Sin embargo, tenemos una gran cantidad de archivos DLL escritos en FORTRAN 90 compilados para 32 bits. Las funciones en los archivos DLL de FORTRAN son bastante sencillas: ingresa datos, saca datos; ningún estado de ningún tipo. Tampoco pasamos mucho tiempo allí, un total de quizás un 3%, pero la lógica de cálculo que realiza es invaluable.Llamando al código de 32 bits del proceso de 64 bits

¿hay algún modo llamar a la DLL de 32 bits de código de 64 bits? MSDN sugiere que no puedo, punto. He hecho algunas operaciones de piratería y verificado esto. Todo arroja una excepción de punto de entrada no válida. La única solución posible que he encontrado hasta ahora es crear contenedores COM + para todas las funciones DLL de 32 bits e invocar COM del proceso de 64 bits. Esto parece un gran dolor de cabeza. También podemos ejecutar el proceso en emulación WoW, pero luego el techo de la memoria no se incrementará, limitando a alrededor de 1.6 gb.

¿Hay alguna otra forma de llamar a las DLL de 32 bits a partir de un proceso de CLR de 64 bits?

Respuesta

32

Usted necesita tener la DLL de 32 bits cargado en un proceso de 32 bits por separado, y que su proceso de 64 bits comunicarse con él a través de la comunicación entre procesos. No creo que haya ninguna manera de cargar un dll de 32 bits en un proceso de 64 bits.

Hay un muy buen artículo aquí:

Accessing 32-bit DLLs from 64-bit code

+0

Esa es la cosa de 64 bits -> COM -> 32 bits que estaba describiendo. Después de leer ese artículo e intentar que la muestra funcionara, decidí que había una mejor manera de hacerlo. Por lo menos eso espero. –

+3

La respuesta de John es correcta. No hay forma de que los módulos de 32 bits y de 64 bits se mezclen en un solo proceso. Debes comenzar un segundo proceso. Véase también mi respuesta aquí: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 –

+2

No necesariamente tienen que utilizar Contenedores COM +, pero necesitas usar un proceso de 32 bits. –

1

Usted tiene que escribir sus procesos ejecutables como los procesos de 32 bits (versus cualquier CPU o x64) por lo que van a ser cargados con WoW32 de Vista. Esto los cargará en el modo de emulación de 32 bits y no tendrá el problema de punto de entrada. Puede dejar sus bibliotecas en modo AnyCPU, pero sus ejecutables deben compilarse como x86.

+1

Parece que lo han considerado, pero necesitan el techo de memoria aumentado que Las ofertas de 64 bits –

+0

La mitad es verdadera: los procesos de 32 bits se ejecutan en una máquina x64 si los compila como x86. Pero si su ejecutable es x86 y sus librerías son AnyCPU, el compilador just-time creará un código x64 que las hará incompatibles con el ejecutable (de 32 bits). Entonces, ** todo lo que incluye los ensamblados ** debe ser x86 o AnyCPU. – Matt

0

respuesta de Juan es correcta si no desea volver a compilar el DLL existentes; sin embargo, esa podría ser una opción para usted también.

Nuestro equipo está migrando nuestro código FORTRAN x86 a x64 para aumentar el techo de la memoria.

+0

esto funciona, siempre y cuando no tenga ningún ensamblado de terceros de 32 bits (sin el código fuente) que necesite agregar como referencia ... – Matt

Cuestiones relacionadas