Mam problem z utworzoną przeze mnie biblioteką DLL trybu mieszanego C++/CLI. Wyrzuca wyjątek podczas rozładowywania, ponieważ aplikacja .NET, która używa go, kończy pracę. Po DLL_PROCESS_DETACH
jest wykonywany, DLL robi Runtime clean-up przy użyciu automatycznie zarejestrowany atexit()/__onexit()
funkcje i rzuca następujący wyjątek:Tryb mieszany C++/CLI DLL generuje wyjątek przy wyjściu
Unhandled exception at 0x752bb9bc (KernelBase.dll) in psstestm.exe:
0xC0020001: The string binding is invalid.
Mam prześledzić problem do atexit()
rozmowy, który jest zarejestrowany przez impuls statyczny wyjątków obiektu get_static_exception_object()
.
Używam boost_1_47 statycznie połączony w większości z wyjątkiem boost :: wątku, który jest dynamicznie połączony, aby uniknąć blokady ładowania. Próbowałem także dynamicznie łączyć wszystkie boosty, które nie pomogły. Także wszystkie elementy doładowania są otoczone blokami #pragma unmanaged
.
Mam nadzieję, że ktoś miał podobny problem lub znał rozwiązanie?
Dzięki, Mark
Oto stos wywołań tuż przed występuje wyjątek:
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
DZIĘKUJEMY !!! Śledziłem to na zawsze. Nie znam C++ wystarczająco dobrze, aby zrozumieć, jak to powoduje wywołanie atexit. – pedz