Me he encontrado con un problema del que estoy bastante seguro de que sé la respuesta, pero supuse que al menos preguntaría si había algo de "magia". bullet "eso podría salvarme un gran dolor de cabeza".Mezcla de 32 bits y 64 bits P/Invoca
Aquí está la vista de alto nivel.
Tengo una aplicación administrada. Esta aplicación interactúa con hardware a través de bibliotecas de terceros de diferentes proveedores. Tengo control total sobre la aplicación administrada que consume y cero control sobre las bibliotecas de API de hardware.
El proveedor A proporciona solo un SDK nativo de 32 bits. Para permitirnos usarlo en sistemas de 64 bits, marcamos la aplicación para que se ejecute en modo de 32 bits. Todo estuvo bien.
Ahora nos estamos integrando con el proveedor B, que proporciona bibliotecas API nativas de 64 bits en máquinas de 64 bits. La DLL nativa de 32 bits del proveedor B no funcionará en un sistema de 64 bits (lo intenté). Si construyo un arnés de prueba corriendo como 64-bit o AnyCPU, funciona bien. Si lo marqué como de 32 bits, falla en las llamadas P/Invoke.
Parece que el hardware del proveedor A y del proveedor B se van a excluir mutuamente en las PC de 64 bits, pero me pregunto si alguien tiene sugerencias sobre cómo solucionarlo.
Ya lo hemos secuestrado en un dominio de aplicación anotehr así que la seguridad está bien. Moverlo a otro proceso es agregar la complejidad de la interfaz que esperábamos evitar, pero parece que eso o abandonar el hardware del Proveedor A. – ctacke
Es bueno que lo haya secuestrado en otro AppDomain. Sin embargo, un AppDomain solo proporciona seguridad entre los componentes del código administrado. El código no administrado puede tomar alegremente un puntero malo y comenzar a arrojar basura en todo el espacio de la memoria de proceso, independientemente de AppDomain. Es posible que desee considerar IPC a través de archivos mapeados en memoria o una técnica similar para que los componentes de terceros no puedan arruinar su aplicación. :) –