¿Puedo cargar un archivo DLL de 32 bits en un proceso de 64 bits en Windows?

Recientemente actualicé el servicio ac # windows 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.

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)?

No, no puedes.

Tanto Windows de 16 bits como 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.

Primero, observe que un puntero de 16 bits de tamaño completo y un puntero plano de 32 bits tienen el 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 transmisió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`01234567, 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

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

Una página web ASP.NET que se ejecute en IIS en un equipo de 64 bits se alojará en una versión de 64 bits del proceso w3wp.exe, y si su página web usa dll de 32 bits, su sitio fallará.

Sin embargo, en IIS puede ir a la 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.