2013-10-16 22 views
0

我需要在我的C#程序中封裝一個非託管函數。
有沒有什麼辦法可以知道我在C#中的託管聲明是否與本機聲明匹配?
我注意到,如果它不匹配,當我嘗試調用它時,不會引發任何執行,所以我不知道該函數是否真的被調用。
(非託管功能來自第三方組件,因此我無法在其中放入日誌或進行更改)。C#Pinvoke - 我如何知道我的託管定義有什麼問題?

+0

AFAIK你不能確定非託管導入函數的簽名。如果它們不匹配,則可能會產生垃圾(或訪問違規)。即使你在本地做了所有事情,你也沒有這樣的東西(假設要改變 - 比方說 - 定義fopen(),它會編譯,但會崩潰)。 –

回答

2

沒有辦法自動檢查您的p/invoke聲明是否與本機函數匹配。責任在於你做對。

通常,如果你弄錯了,會引發異常。但不總是。

1

偶爾我在我自己的非託管DLL中複製了一個複雜的函數簽名,並測試瞭解P/Invoke如何封裝參數。如果您在託管項目中啓用了非託管調試,那麼您可以從託管代碼調試到非託管代碼,這可以幫助您解決P/Invoke失敗的原因。

相關問題