在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為數組長度。
調用時則寫為:
懶一點,就用一個字符串查看結果: