700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C#通过DllImport引入dll中的C++非托管类

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

时间:2019-06-16 21:49:58

相关推荐

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

首先从msdn了解到,DllImport是用来将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。 从以上语句我们可以理解出三点: 1.C++编写的非托管dll可以通过DllImport引入到C#中; 2.引入到C#中的只能是C++方法(或者说函数),而不能是数据(或者说变量); 3.引入到C#中后只能声明为静态函数; msdn关于DllImport属性类的链接: /zh-cn/library/system.runtime.interopservices.dllimportattribute(v=VS.100).aspx DllImport的其使用格式如下所示:

[DllImport("compute.dll", EntryPoint = "FunName", CharSet =CharSet.Auto)] public static externintFunName(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的参数属性等请参考如下链接: /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#中,不过就相当于成为了静态类,使用受到了很大限制,不可以再定义多个对象了;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。