Tengo un problema con una DLL de modo mixto C++/CLI que he creado. Lanza una excepción al descargar cuando sale la aplicación .NET que la usa. Después de ejecutar DLL_PROCESS_DETACH
, la DLL hace tiempo de ejecución de limpieza automáticamente registrado atexit()/__onexit()
funciones y lanza la siguiente excepción:El DLL de C++/CLI en modo mixto arroja una excepción en la salida
Unhandled exception at 0x752bb9bc (KernelBase.dll) in psstestm.exe:
0xC0020001: The string binding is invalid.
he rastreado el problema a un atexit()
llamada que está registrada por un objeto de excepción impulso estática get_static_exception_object()
.
function_to_call 0x0f560410 [email protected][email protected][email protected][email protected][email protected]@@@[email protected]@@[email protected]@[email protected]@[email protected]@YAXXZ void (void)*
estoy usando boost_1_47 enlazado estáticamente en su mayor parte, excepto impulso :: hilo que está vinculado dinámicamente para evitar LoaderLock. También intenté vincular dinámicamente todo el impulso que no ayudó. Además, todo el impulso incluye están rodeados por bloques #pragma unmanaged
.
Espero que alguien haya tenido un problema similar o conozca una solución?
Gracias, Mark
Aquí está la pila de llamadas justo antes de que se produce la excepción:
psscorem.dll!_CRT_INIT(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 413 C
psscorem.dll!__DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 526 + 0x11 bytes C
psscorem.dll!_DllMainCRTStartup(void * hDllHandle=0x0f4b0000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 476 + 0x11 bytes C
[email protected]() + 0xde bytes
[email protected]() + 0xad bytes
[email protected]() + 0x14 bytes
[email protected]() + 0x141 bytes
[email protected]() + 0x74 bytes
kernel32.dll!749479f5()
mscoreei.dll!RuntimeDesc::ShutdownAllActiveRuntimes() + 0xc8 bytes
mscoreei.dll!CLRRuntimeHostInternalImpl::ShutdownAllRuntimesThenExit() + 0x15 bytes
clr.dll!EEPolicy::ExitProcessViaShim() + 0x66 bytes
clr.dll!SafeExitProcess() + 0x99 bytes
clr.dll!DisableRuntime() - 0x1146bb bytes
clr.dll!EEPolicy::HandleExitProcess() + 0x57 bytes
[email protected]() + 0x11c bytes
[email protected]() + 0x1c bytes
[email protected]() + 0x38 bytes
[email protected]() + 0x227 bytes
[email protected]() + 0x8 bytes
[email protected]@12() + 0x12 bytes
[email protected]() + 0x27 bytes
[email protected]() + 0x1b bytes
¡¡GRACIAS !!! He estado rastreando esto para siempre. No conozco C++ lo suficiente como para entender cómo eso causa una llamada a atexit. – pedz