ACTUALIZACIÓN PARA .NET 4.0 Y MÁS RECIENTES MARCOS
Esta es una vieja pregunta que se hacía en el momento de .Net 2.0, cuando el soporte para DLL de modo mixto tenía serios problemas de inicialización, propensos a bloqueos aleatorios. A partir de .Net 4.0, la inicialización de las DLL de modo mixto ha cambiado. Ahora hay dos etapas separadas de inicialización:
- Inicialización nativa, llamada en el punto de entrada de la DLL, que incluye la configuración nativa en tiempo de ejecución de C ++ y la ejecución de su método DllMain.
- Inicialización administrada, ejecutada automáticamente por el cargador del sistema.
Dado que el paso 2 se realiza fuera del bloqueo del cargador, no hay puntos muertos. Los detalles se describen en Inicialización de ensamblajes mixtos .
Para asegurarse de que su ensamblado de modo mixto se pueda cargar desde un ejecutable nativo, lo único que necesita verificar es que el método DllMain esté declarado como código nativo. #pragma unmanaged
podría ayudar aquí:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
... // your implementation here
}
También es importante que cualquier código al que DllMain pueda llamar directa o indirectamente tampoco esté administrado. Tiene sentido limitar el tipo de funcionalidad utilizada por DllMain para que pueda rastrear todo el código accesible desde DllMain y asegurarse de que todo esté compilado #pragma unmanaged
.
El compilador ayuda un poco al advertirle a C4747 si detecta que DllMain no está declarado como no administrado:
1> Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint
Sin embargo, el compilador no generará ninguna advertencia si DllMain llama indirectamente a alguna otra función administrada, por lo que debe asegurarse de que eso nunca suceda, de lo contrario, su aplicación podría bloquearse aleatoriamente.