1. 程式人生 > >C#呼叫C++的dll 常見錯誤解決方法

C#呼叫C++的dll 常見錯誤解決方法

C# 和 C/C++ 互動可以使用輔助工具:    Depends:檢測.exe/dll檔案中的依賴庫有哪些;    PInvoke從功能上來說,只支援函式呼叫,在被匯出的函式前面一定要新增extern “C來指明匯出函式的時候使用C語言方式編譯和連結的,這樣保證函式定義的名字相同,否則如果預設按C++方式匯出,那個函式名字就會變得亂七八糟,我們的程式就無法找到入口點了。

==================================================================================================================================================================================================================1、 異常錯誤:
System.BadImageFormatException: 試圖載入格式不正確的程式。 (異常來自 HRESULT:0x8007000B)    原因: 1、因為'任何 CPU'(Any CPU)的程式在64位的機器上就會用執行為64位,而64程式是不能載入32位dll的;    解決方法:專案右鍵屬性->專案設計器->生成->平臺->把'預設設定(任何 CPU)(Any CPU) '改為x86了,解決方案中,“配置專案管理器”中,把平臺修改為x86的;    原因2:可能是該dll中所應用的庫/或者是依賴庫不是32位dll;(使用對應的32位dll)    解決方法:使用對應的dll庫
2、異常錯誤:EntryPointNotFoundException 找不到入口點,在Dll “xxxx.dll”中,無法找到“xxxx”函式入口點    原因1:c++原始碼中的函式在編譯成DLL後,函式的名稱就發生了改變:會在函式的前後產生一些字元,所以找不到方法的入口點;    解決方法:函式定義前加上:extern "C" __declspec(dllimport) ;函式宣告前:extern "C" __declspec(dllexport) ;    原因2:C++中沒有該函式的宣告和定義;    解決方法:檢視C++程式碼中,是否有該函式宣告和實現;C#程式碼引入dll時候的定義,函式名稱是否錯誤;(兩處地方函式名是否一致 )3、異常錯誤:
  System.DllNotFoundException :無法載入 DLL “xxx.dll”: 找不到指定的模組。(異常來自 HRESULT:0x8007000B)    原因:1、專案引用的dll缺失;              2、引用的dll庫專案依賴的dll缺失;    解決方法:查詢軟體執行路徑下,專案引用的dll庫是否存在,不存在則新增;檢查引用的dll庫專案依賴的dll是否存在,不存在則新增到路徑下;(注意版本 32/64位)

4、異常錯誤:嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞。

    原因:可能是因為C++和C#的引數型別對應問題;

    解決方法:排查引數型別是否對應;