gpt4 book ai didi

dll - 混合模式C++/CLI DLL在退出时引发异常

转载 作者:行者123 更新时间:2023-12-04 04:00:00 28 4
gpt4 key购买 nike

我创建的C++/CLI混合模式DLL有问题。当使用它的.NET应用程序退出时,它会引发异常。执行DLL_PROCESS_DETACH后,DLL使用自动注册的atexit() / __onexit()函数进行运行时清理,并引发以下异常:

Unhandled exception at 0x752bb9bc (KernelBase.dll) in psstestm.exe: 
0xC0020001: The string binding is invalid.

我已将问题追溯到 atexit()调用,该调用由静态boost异常对象 get_static_exception_object()注册。
    function_to_call    0x0f560410 _t2m@???__Fep@?1???$get_static_exception_object@Ubad_exception_@exception_detail@boost@@@exception_detail@boost@@YA?AVexception_ptr@1@XZ@YAXXZ@?A0x0a546e27@@YAXXZ   void (void)*

我使用的是boost_1_47大部分是静态链接的,除了boost::thread会动态链接以避免loaderlock。我还尝试过动态链接所有没有帮助的Boost。同样,所有 boost 功能都被 #pragma unmanaged块包围。

我希望有人遇到类似的问题或知道解决方案吗?

谢谢马克

这是异常发生之前的调用堆栈:
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
mscoreei.dll!__CorDllMain@12() + 0xde bytes
mscoree.dll!_ShellShim__CorDllMain@12() + 0xad bytes
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_LdrShutdownProcess@0() + 0x141 bytes
ntdll.dll!_RtlExitUserProcess@4() + 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
clr.dll!__CorExeMainInternal@0() + 0x11c bytes
clr.dll!__CorExeMain@0() + 0x1c bytes
mscoreei.dll!__CorExeMain@0() + 0x38 bytes
mscoree.dll!_ShellShim__CorExeMain@0() + 0x227 bytes
mscoree.dll!__CorExeMain_Exported@0() + 0x8 bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes

最佳答案

我曾经遇到过同样的问题,并设法将其跟踪到exception_ptr.hpp中的以下函数:

    template <class Exception>
exception_ptr
get_static_exception_object()
{
Exception ba;
exception_detail::clone_impl<Exception> c(ba);
c <<
throw_function(BOOST_CURRENT_FUNCTION) <<
throw_file(__FILE__) <<
throw_line(__LINE__);
static exception_ptr ep(shared_ptr<exception_detail::clone_base const>(new exception_detail::clone_impl<Exception>(c)));
return ep;
}

这里有问题的部分是: 静态exception_ptr ep(...

您可以删除静态文件,它应该可以正常工作:
    template <class Exception>
exception_ptr
get_static_exception_object()
{
Exception ba;
exception_detail::clone_impl<Exception> c(ba);
c <<
throw_function(BOOST_CURRENT_FUNCTION) <<
throw_file(__FILE__) <<
throw_line(__LINE__);
exception_ptr ep(shared_ptr<exception_detail::clone_base const>(new exception_detail::clone_impl<Exception>(c)));
return ep;
}

注意如何使用此函数,它将返回的静态变量分配给另一个静态变量。此功能的整个实现看起来很可疑,可能我会在对此的 boost 支持上提出一个问题。

可能还有其他解决方法来解决此问题。可以在这里找到有关混合程序集中的静态变量的更多分析: http://derevyanko.blogspot.com/2009/01/clic.html但是仅俄语。

关于dll - 混合模式C++/CLI DLL在退出时引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com