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