C#通过DllImport引入dll中的C++非托管类
生活随笔
收集整理的這篇文章主要介紹了
C#通过DllImport引入dll中的C++非托管类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先從msdn了解到,DllImport是用來
將特性化方法由非托管動態鏈接庫 (DLL) 作為靜態入口點公開。
從以上語句我們可以理解出三點:
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類的代碼如下: ? 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(); ? } 具體DllImport的參數屬性等請參考如下鏈接: http://blog.csdn.net/jame_peng/article/details/4387906 4.在主程序中進行驗證 由于引入的方法都是靜態的,所以不能通過對象進行調用,而只能通過類來調用,具體代碼如下: ? ?? ? ?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#中,不過就相當于成為了靜態類,使用受到了很大限制,不可以再定義多個對象了;
[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類的代碼如下: ? 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(); ? } 具體DllImport的參數屬性等請參考如下鏈接: http://blog.csdn.net/jame_peng/article/details/4387906 4.在主程序中進行驗證 由于引入的方法都是靜態的,所以不能通過對象進行調用,而只能通過類來調用,具體代碼如下: ? ?? ? ?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#中,不過就相當于成為了靜態類,使用受到了很大限制,不可以再定義多個對象了;
總結
以上是生活随笔為你收集整理的C#通过DllImport引入dll中的C++非托管类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web项目部署到阿里云
- 下一篇: 微信小程序navigateBack如何带