1. 程式人生 > >C#導入c++ dll報找不到dll文件 masm32調用c++類庫

C#導入c++ dll報找不到dll文件 masm32調用c++類庫

dll sca masm32 ++ 時也 類型 dumpbin exports 另一個

  最近需要在C#下調用一個c++ dll庫,不管怎樣dllimport就是報錯找不到該dll文件,路徑、函數名稱、參數、dllimport參數逐個檢查確認無誤也無濟於事,無奈想用其他語言調用試試,由於是c++的dll照理用c++試最好了,這點事用masm32開發簡單快捷就用masm32寫了個調用小程序,這其中有個修飾名問題需要註意。使用dumpbin 命令查看c++ dll發現使用的是默認修飾名__cdecl,關於masm32怎樣調用c++最簡單就是在c++裏使用 extern “c”,可惜這個dll並沒有使用 extern “c”,好在masm32修飾名可以隨便指定,syscall壓棧次序和__cdecl相同,編譯連接時也不對函數名進行修飾,於是就用syscall 做了個函數聲明,函數名稱直接復制dumpbin /exports出來的函數全名稱,不管c++裏參數類型是什麽到masm32裏都是dword解決,數數c++參數個數在masm32聲明裏填上對應個數dword,然後編譯鏈接ok。

  繼續說回C#找不到dll文件問題,運行masm32程序彈出找不到該c++ dll依賴的另一個dll,於是找到這個依賴dll復制到c#引用目錄下再次運行c#,通過。

  結論:C#調用c++等非托管代碼不僅要保證函數名稱、參數名稱、返回類型等正確,還要保證c#能找到該非托管代碼所依賴的dll。

C#導入c++ dll報找不到dll文件 masm32調用c++類庫