C# 呼叫 C++ DLL方法
在C# 中,可以通過 DllImport 呼叫C++ 的非託管DLL程式。
VS2010中C#呼叫C++的DLL示例:
一、新建C++ DLL程式
1、新建 C++ Win32專案,型別為DLL。
生成的檔案結構如圖:
其中,“MyDLLFun.cpp”檔案為此專案主要原始檔。
2、在原始檔中新增需要被外部呼叫的方法。
這裡僅僅是新增兩個示例方法:
方法“Add”返回兩個整數的和;方法Pow計算X 的 Y 次方,並以指標的形式修改引數 x 地址處的值。
修飾符 extern "C" 包含雙重含義:首先,被它修飾的目標是“extern”的;其次,被它修飾的目標是“C”的。而被extern "C"修飾的變數和函式是按照C語言方式編譯和連線的。
__declspec(dllexport)的目的是為了將對應的函式放入到DLL動態庫中。
extern "C" __declspec(dllexport)加起來的目的是為了使用DllImport呼叫非託管C++的DLL檔案。因為使用DllImport只能呼叫由C語言函式做成的DLL。
新增完方法後,編譯生成DLL檔案。
二、在C#中使用DLL程式。
首先,將新生成的都來了拷貝到C#工程bin\Debug目錄下。
然後,利用DllImport匯入DLL程式中的方法,為方便管理,新建一個名為CppDll的類,並在此匯入DLL方法:
說明:1)需要引用名稱空間using System.Runtime.InteropServices;
2)建議增加特性CallingConvention= CallingConvention.Cdecl,不然可能會出現 “堆疊不對稱”錯誤:
3)DLL中的方法,必須申明為 static,extern 的。
最後,在需要的地方呼叫這些方法即可。
說明:C++中函式Pow中傳的為指標,也即是變數的地址,在C#修飾符 ref 即表示“傳址”,所以C++中的 int*對應於 C#中的ref int
三、稍微擴充套件一下,在函式中傳遞陣列。
在C++中新增函式
在C++中,函式引數為陣列時傳遞的為陣列的首地址,和陣列的長度,如上。那麼對應於C#中就應該是:
其中 ref double ary 為某個double型別陣列的第一個元素的地址,len為陣列長度。
呼叫時則寫為:
懶一點,就用一個字串檢視結果: