我有一个WinForms应用程序,它使用几个C++/CLI DLL,这些DLL又与Boost链接。由于 Boost 或 std 库的一些古怪,当我正常退出此应用程序时(即使在加载后(,它也会由于双重释放C++区域设置方面而崩溃。为了解决这个问题,我开始使用 Process.GetCurrentProcess().Kill()
,但后来当我需要一个正常的退出来有一个 0 退出代码(即用于自动测试(时,我改用使用 Environment.Exit(0)
。
我刚刚将依赖项从使用 VS 2010 编译的 .NET 4 和 Boost 1.54 升级到使用 VS 2013 编译的 .NET 4.5 和 Boost 1.56。在升级之前,Environment.Exit(0)
工作正常。升级后,它将无限期挂起。当我切换回Process.GetCurrentProcess().Kill()
时,它退出正常(退出代码除外(。当我让它在没有任何解决方法的情况下正常关闭时,我仍然会遇到区域设置方面崩溃(所以我想 Boost 或 std C++ 中的问题没有得到修复(。所以我仍然需要解决方法才能工作。
我观察到的一些奇怪的事情:
- 当我关闭程序并且它挂起时,然后打开"线程"选项卡进程资源管理器中的进程,进程完成关闭 当我打开进程的"线程"选项卡,
- 然后关闭程序时,它挂起;即使我从"线程"选项卡切换并返回它保持挂起
- 在后一种情况下,有一个线程仍在运行(或等待(。线程的起始地址是"!"。克托尔"。InteropQonverter.dll对一些Boost代码的调用引起了我的注意,但我不知道它是否是一个准确的堆栈跟踪,因为这是一个发布版本。InteropQonverter.dll显然是我的C++/CLI DLL之一。但它不使用 boost::serialization AFAIK。
任何想法是什么导致了这种情况或如何解决它?
编辑:这是来自调试版本的堆栈跟踪,它具有相同的症状。它挂在我的 DLL 的 CRT 初始化中更有意义。它似乎抛出了异常,但我抓不到?
ntdll.dll!ZwDelayExecution() + 0xa bytes
KernelBase.dll!SleepEx() + 0xb3 bytes
ntdll.dll!RtlpExecuteHandlerForException() + 0xd bytes
ntdll.dll!RtlDispatchException() + 0x38f bytes
ntdll.dll!KiUserExceptionDispatch() + 0x2e bytes
KernelBase.dll!RaiseException() + 0x3d bytes
InteropQonverter.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 415 C
InteropQonverter.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 526 + 0x13 bytes C
InteropQonverter.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 477 C
mscoreei.dll!000007fef8405795()
[Frames below may be incorrect and/or missing, no symbols loaded for mscoreei.dll]
mscoree.dll!ShellShim__CorDllMain() + 0xe1 bytes
mscoree.dll!_CorDllMain_Exported() + 0x37 bytes
ntdll.dll!LdrShutdownProcess() + 0x1d1 bytes
ntdll.dll!RtlExitUserProcess() + 0x90 bytes
mscoreei.dll!000007fef83f3067()
mscoreei.dll!000007fef83f3300()
mscorlib.ni.dll!000007fef706188b()
[Managed to Native Transition]
mscorlib.dll!System.Environment.Exit(int exitCode) + 0x7b bytes
IDPicker.exe!IDPicker.IDPickerForm.IDPickerForm_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) Line 1593 + 0x7 bytes C#
我将其追踪到"无效字符串绑定"错误,这就是我首先添加 Kill((/Exit(( 调用的原因。然后,当我遵循以下解决方案时,我显然更改了一些内容:0xC0020001:字符串绑定无效。- 仅在 WPF 中出现(我/NOENTRY
添加到我的 C++/ClI DLL 的链接器选项中(