首先從msdn了解到,DllImport是用來
將特性化方法由非托管動態鏈接庫 (DLL) 作為靜態入口點公開。
? class computer ? { ? ? ? [DllImport("compute.dll", EntryPoint ="?getmember@computer@@QAEHH@Z", CharSet = CharSet.Auto)] ? ? ? public static extern int getmember(intindex); ? ? ? [DllImport("compute.dll",EntryPoint="?setmember@computer@@QAEXHH@Z",CharSet=CharSet.Auto)] ? ? ? public static extern void setMember(int m1,intm2); ? ? ? [DllImport("compute.dll", EntryPoint ="?sum@computer@@QAEHHH@Z", CharSet = CharSet.Auto)] ? ? ? public static extern int sum(int mem1, intmem2); ? ? ? [DllImport("compute.dll", EntryPoint ="?sum@computer@@QAEHXZ", CharSet = CharSet.Auto)] ? ? ? public static extern int sum(); ? ? ? [DllImport("compute.dll", EntryPoint ="?sub@computer@@QAEHHH@Z", CharSet = CharSet.Auto)] ? ? ? public static extern int sub(int mem1, intmem2); ? ? ? [DllImport("computer.dll", EntryPoint ="?sub@computer@@QAEHXZ", CharSet = CharSet.Auto)] ? ? ? public static extern int sub(); ? }
? ? ? ? ? computer.setMember(4, 5); ? ? ? ? ? Console.WriteLine(computer.getmember(1)); ? ? ? ? ? Console.WriteLine(computer.getmember(2)); ? ? ? ? ? Console.WriteLine(computer.sum()); ? ? ? ? ? Console.WriteLine(computer.sum(1,2)); ? ? ? ? ? Console.WriteLine(computer.sub(3,1));
從以上語句我們可以理解出三點:
1.C++編寫的非托管dll可以通過DllImport引入到C#中;
2.引入到C#中的只能是C++方法(或者說函數),而不能是數據(或者說變量);
3.引入到C#中后只能聲明為靜態函數;
msdn關于DllImport屬性類的鏈接:
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute(v=VS.100).aspx
DllImport的其使用格式如下所示:
[DllImport("compute.dll", EntryPoint = "FunName", CharSet =CharSet.Auto)]
public static externint? FunName(typevar);
注:其引入格式中static和extern是必不可少的;
接下來主要講述如何通過DllImport將C++類通過dll引入到C#:
1.生成包含C++類的dll
源代碼如下所示:
computer.h:
#pragma once
class computer
{
computer();
public:
__declspec(dllexport) int sum(int mem1,int mem2);//計算兩個參數之和:mem1+mem2
__declspec(dllexport) int sum();//計算兩個成員變量之和:computer::mem1+computer::mem2
__declspec(dllexport) int sub(int mem1,int mem2);//計算兩個參數之差:mem1-mem2
__declspec(dllexport) int sub();//計算兩個成員變量之差:computer::mem1-computer::mem2
__declspec(dllexport) void setmember(int m1,int m2);//設定兩個成員靜態變量mem1和mem2的值
__declspec(dllexport) int getmember(int index);//index=1或2,分別讀取mem1和mem2的值
private:
static int mem1;//只有聲明為靜態變量,才可以在C#中訪問修改
static int mem2;
};
int computer::mem1=8;//靜態成員初始化
int computer::mem2=9;
實現代碼不在此贅述,編譯生成dll。
2.將生成dll放置到C#工程的debug\bin目錄下;
3.向C#工程中引入此dll并導入編寫的類
向C#工程中添加新類computer,在生成的computer.cs文件中添加代碼:
using System.Runtime.InteropServices;//此語句保證能夠調用DllImport
編寫computer類的代碼如下:
具體DllImport的參數屬性等請參考如下鏈接:
http://blog.csdn.net/jame_peng/article/details/4387906
4.在主程序中進行驗證
由于引入的方法都是靜態的,所以不能通過對象進行調用,而只能通過類來調用,具體代碼如下:
經驗證,這樣的方法是可行的。
最后,總結一下:
1.非托管的C++函數是可以通過dll經由DllImport引入到C#中,不過就變成靜態的了;
2.非托管的C++類也可以通過以上方法引入到C#中,不過就相當于成為了靜態類,使用受到了很大限制,不可以再定義多個對象了;