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

文章来自:http://blog.sina.com.cn/s/blog_70a144580100tmj8.html


首先从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 extern int FunName(type var);


注:其引入格式中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(int index);
        [DllImport ("compute.dll",EntryPoint="?setmember@computer@@QAEXHH@Z",CharSet=CharSet.Auto )]
        public static extern void setMember(int m1,int m2);
        [DllImport("compute.dll", EntryPoint = "?sum@computer@@QAEHHH@Z", CharSet = CharSet.Auto)]
        public static extern int sum(int mem1, int mem2);
        [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, int mem2);
        [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#中,不过就相当于成为了静态类,使用受到了很大限制,不可以再定义多个对象了;


以上为个人总结,若有纰漏,敬请指正。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值