2008-10-22 35 views
33

Recientemente actualicé un servicio de Windows C# para ejecutarlo como un proceso .net de 64 bits. Normalmente, esto sería trivial, pero el sistema hace uso de una DLL de 32 bits escrita en C++. No es una opción convertir esta DLL a 64 bits, así que envolví la DLL en un proceso separado de .net de 32 bits y expuse una interfaz .net a través de la comunicación remota.¿Puedo cargar una DLL de 32 bits en un proceso de 64 bits en Windows?

Esta es una solución bastante confiable, pero preferiría ejecutar el sistema como un proceso único. ¿Hay alguna forma de que pueda cargar mi archivo DLL de 32 bits en un proceso de 64 bits y acceder a él directamente (quizás a través de algún tipo de capa thunk)?

Respuesta

25

No, no puedes.

Ambos Windows de 16 y 32 bits vivían en un espacio de direcciones lineal de 32 bits. Los términos 16 y 32 se refieren al tamaño del desplazamiento relativo al selector.

...

En primer lugar, observe que un puntero de 16 bits de tamaño completo y un puntero plana de 32 bits son del mismo tamaño. El valor 0x0123: 0x467 requiere 32 bits, y wow, también lo hace un puntero de 32 bits. Esto significa que las estructuras de datos que contienen punteros no cambian el tamaño entre sus contrapartes de 16 bits y 32 bits. Una coincidencia muy útil.

Ninguna de estas dos observaciones es válida para la conversión de 32 bits a 64 bits. El tamaño del puntero ha cambiado, lo que significa que la conversión de una estructura de 32 bits a una estructura de 64 bits y viceversa cambia el tamaño de la estructura. Y el espacio de direcciones de 64 bits es cuatro mil millones de veces mayor que el espacio de direcciones de 32 bits. Si hay algo de memoria en el espacio de direcciones de 64 bits en el desplazamiento 0x000006fb`, el código de 32 bits no podrá acceder a él. No es como si pudiera construir una ventana de dirección temporal, porque el código plano de 32 bits no conoce estas ventanas de direcciones temporales; abandonaron selectores, ¿recuerdas?

http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx

6

Si su aplicación .NET es un sitio web que se ejecuta en IIS puede eludirlo.

Una página web ASP.NET ejecutada en IIS en una máquina de 64 bits será alojada por una versión de 64 bits del proceso w3wp.exe, y si su página web usa dlls de 32 bits, su sitio fallará.

Sin embargo, en IIS puede ir a Configuración avanzada del grupo de aplicaciones que ejecuta el sitio y cambiar "Habilitar aplicaciones de 32 bits" a verdadero.

Por lo tanto, todavía no se puede ejecutar dll de 32 bits dentro del proceso de 64 bits, sino que se está ejecutando w3wp.exe como un proceso de 32 bits en su lugar.

+4

La pregunta establece que el proceso es un servicio de Windows en lugar de un sitio web de ASP.NET. Además, las configuraciones de IIS que describe implementan efectivamente la misma solución que la pregunta está tratando de evitar. –

Cuestiones relacionadas