1. 程式人生 > 其它 >C# 呼叫 C++ DLL方法

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為陣列長度。

呼叫時則寫為:

懶一點,就用一個字串檢視結果: