2010-04-15 32 views
3

我正在重組舊的混合(託管和非託管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框架構建的。

回答

4

我相信我解決了我的問題。通過系統地刪除每個庫引用和註釋掉應用程序代碼(非託管)中對該特定庫的調用,我最終刪除了問題庫並讓程序運行。這是診斷問題的強力方式,幸運的是,我不需要移除太多的庫來解決問題。如果任何人有評論,如果可以通過調試器識別庫,我仍然很好奇。
因此,下一步是將這些庫調用轉移到託管代碼,並通過我的網橋DLL將信息傳回非託管端。順便說一句,我重新將winmm.lib集成到項目中,它仍然有效。