2010-05-16 26 views
0

我對在WPF應用程序中失敗但未在簡單的初始化WPF應用程序中失敗的非託管DLL執行p-invoke調用。我試圖找出問題所在,但最終得出的結論是,如果在撥打電話之前分配太多內存,呼叫就會失敗。我有兩個獨立的代碼塊,兩者都可以自己成功,但如果兩者都運行,則會導致失敗。 (它們與p-invoke調用嘗試執行的操作無關)。如果預先分配的內存太多,P調用調用失敗

非託管庫中會出現什麼樣的問題會導致這樣的問題?我認爲託管和非託管堆應該被自動分開。

據我所知,崩潰發生在一個p調用的動態加載的輔助DLL中。這可能與它有關嗎?

回答

0

非託管代碼是容易發生破壞堆。這種腐敗的副作用是非常不可預測的,這取決於事後發生的那些損壞的記憶。如果腐敗不在關鍵位置,這並不罕見。改變程序的內存分配模式可以改變結果。

你現在真正知道的是,非託管代碼是不可信的。做一些事情總是很難,特別是託管主機程序。直到你開始爲這個非託管代碼編寫單元測試,使用非託管代碼來執行代碼,並找到一個可重複使用的炸彈,你可以用一個非託管調試器來解決這個問題。

+0

好吧,有道理。 – RandomEngy 2010-05-18 02:59:04

0

由於沒有太多的信息可以使用,所以在黑暗中拍攝。

是否有可能需要將非託管DLL加載到特定的基址,並且當您分配的內存太多或其他程序集加載時,DLL無法加載到正確的地址。

http://msdn.microsoft.com/en-us/library/w368ysh2.aspx