日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#通过DllImport引入dll中的C++非托管类

發布時間:2023/12/10 C# 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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#中,不過就相當于成為了靜態類,使用受到了很大限制,不可以再定義多個對象了;

總結

以上是生活随笔為你收集整理的C#通过DllImport引入dll中的C++非托管类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。