我正在重組舊的混合(託管和非託管dll)應用程序,以便主應用程序段是非託管的MFC並且將調用使用/ clr標誌將橋接託管(C#DLL)和非託管代碼之間的通信。不幸的是,我的更改導致在調用應用程序InitInstance()之前發生訪問衝突。這使調試非常困難。我得到的唯一信息是以下堆棧跟蹤。運行使用/ clr構建的DLL的本機C++應用程序時的訪問衝突
> 64006108()
[email protected]() + 0xc bytes
[email protected]() + 0x7a bytes
所以,這裏有一些我嘗試過的設計。
- 打開異常 - > Win32異常 - > c0000005訪問衝突時拋出。仍然我得到的最詳細的是從上面的堆棧跟蹤。我用F10試過了這個應用程序,但是在任何斷點被擊中之前它失敗了,並且以上面的堆棧跟蹤失敗了。
- 我已經挖出橋DLL,以便它只有一個方法返回一個BOOL和該方法被編碼爲只返回false(沒有C#代碼調用)。
bool DllPassthrough::IsFailed() { return false; }
如果存根DLL與/ CLR標誌編譯應用程序失敗。如果編譯時沒有/ clr標誌,則應用程序運行。
- 我創建了一個使用Visual Studio嚮導的多文檔應用程序的存根MFC應用程序,並調用DllPassthrough :: IsFailed()。即使用於編譯DLL的/ clr標誌也會成功。
- 我試過在winmm.lib上做一個手動的LoadLibrary,如下面的註釋Access violation when using c++/cli所述。應用程序仍然失敗。
那麼,我的問題是如何解決這個問題?任何提示,策略或以前的事件。而且,如果失敗了,我怎樣才能獲得關於什麼代碼段或庫導致訪問異常的更多信息?如果我嘗試更多涉及到執行LoadLibrary調用的解決方法,我想將其縮小到失敗的庫。
謝謝。順便說一下,我們正在使用Visual Studio 2008,並且該項目是針對受管理部分的.NET 2.0框架構建的。