我有一个加载到 C# 应用程序中的 CLI DLL(混合纯 C++ 和托管代码,VS2005)。一切正常,但当 C# 应用程序关闭时(单击主窗体标题栏中的小“X”按钮)应用程序崩溃并显示一条消息,告诉我“未知软件异常”(0xC0020001) 发生在地址 07C812AEB。消息的标题是“.NET BroadcastEventWindow.2.0 ......”
无法找到原因,因为 Visual Studio 调试器不会在崩溃位置停止。
当我将应用程序加载到 OllyDebug 时,它告诉我崩溃可能发生在 mscorwks.dll 的深处。
我使用纯 C++ 类和混合类,它们全部由 #pragma managed
和 #pragma unmanaged
分隔。
可能是什么原因?
最佳答案
好的。最后,我减少了 DLL 中的代码,直到不再发生任何崩溃。我最终有几个空的类,我找到了罪魁祸首。
我发现的东西太奇怪了,没有任何逻辑,我不得不在这里发布我的结果。
在其中一个纯 C++ 类(不包含任何托管代码)中,我在头文件中使用了一个单例:
inline static CMyClass& Instance()
{
static CMyClass i_Inst;
return i_Inst;
};
当应用程序退出导致崩溃时,这里出现任何错误。
当我删除单例并将类实例化为 CPP 文件中的全局变量时,如:
CMyClass gi_Instance;
崩溃消失了!
我看不出我的 Singleton 有什么问题。我想这是一个 Visual Studio 错误。
注意: 我也在纯 C++ DLL 中使用具有相同 Singleton 的相同类并且没有问题。只有在 CLI 项目中编译时才会出现此问题。
注意 2: 当我将 OutputDebugString(L"Destructor CMyClass");
放入 CMyClass 的析构函数中时,只要我在 Trace 中就永远不会看到该消息使用单例。使用全局变量可以正确调用析构函数。
关于crash - 应用程序关闭时 CLI DLL 中无法解释的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28815209/