Pregunta

Recientemente actualicé un servicio de c # windows para ejecutarlo como un proceso .net de 64 bits. Normalmente, esto sería trivial, pero el sistema utiliza un DLL de 32 bits escrito en C ++. No es una opción para convertir esta DLL a 64 bits, así que envolví la DLL en un proceso .net de 32 bits por separado 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 solo proceso. ¿Hay alguna manera de que pueda cargar mi DLL de 32 bits en un proceso de 64 bits y acceder a ella directamente (tal vez a través de algún tipo de capa de procesador)?

¿Fue útil?

Solución

No, no puedes.

  

Windows de 16 bits y 32 bits vivía 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 de tamaño entre sus contrapartes de 16 y 32 bits. Una coincidencia muy útil.

     

Ninguna de estas dos observaciones es válida para thunk 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 más grande 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 ella. No es como si pudiera crear una ventana de dirección temporal, porque el código plano de 32 bits no conoce estas ventanas de dirección temporal; Abandonaron a los selectores, ¿recuerdas?

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

Otros consejos

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

Una página web ASP.NET que se ejecuta en IIS en una máquina de 64 bits se alojará en una versión de 64 bits del proceso w3wp.exe, y si su página web usa archivos 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 la verdad.

Por lo tanto, aún no puede ejecutar una DLL de 32 bits dentro de un proceso de 64 bits, sino que está ejecutando w3wp.exe como un proceso de 32 bits en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top