2015-03-02 39 views
1

我有一個CLI DLL(混合純C++和託管代碼,VS2005),我加載到C#應用程序中。所有工作都很好,但是當C#應用程序關閉時(單擊主窗體標題欄中的小「X」按鈕),應用程序崩潰時會顯示一條消息,告訴我發生了一個「未知軟件異常」(0xC0020001)地址07C812AEB。該消息的標題是「.NET BroadcastEventWindow.2.0 .....」當應用程序關閉時遇到CLI DLL中的無法解釋的崩潰(解決)

因爲Visual Studio Debugger不會在崩潰位置停止,所以找不到原因是不可能的。

當我將應用程序加載到OllyDebug時,它告訴我崩潰可能發生在mscorwks.dll深處。

我使用純C++類和混合類,全部由#pragma managed#pragma unmanaged分開。

有沒有人知道可能是什麼原因?

好的,我知道用這麼少的信息來回答這個問題是不可能的。但我無法提供更多信息,因爲它不可用。

回答

1

好的。最後,我減少了我的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的析構函數中時,只要我使用Singleton,我從不會在Trace中看到那條消息。用全局變量正確調用析構函數。