C#与C++的混合编程 之二 使用非托管dll 导出标准函数
2015-11-29 12:40
351 查看
C#与C++的混合编程 之二 使用非托管dll 导出标准函数
前面我们介绍了C#与C++混合编程的几种方式,并介绍了用CLR封装非托管dll的调用方法,下面我们介绍一下C#调用非托管C++导出标准C接口的方式。(1)建立生成dll的工程
打开VS,选择"新建项目"-“VC++”-"Win32"-"Win32项目",工程的名字叫"MyNativeDll",配置如下图所示,因为我有可能用到MFC的类,所以我就勾选了“MFC”的选项,在此需要注意的是,如果你新建时没有勾选MFC,但在后面却想动用MFC的内容,就会遇到“MFC
apps must not #include <windows.h>”的Error,只是在工程的配置里修改是根本没有用的,必做要重建工程。
![](http://img1.51cto.com/attachment/201309/200413256.jpg)
(2)实现dll导出的函数
新建好工程后,在VS的“解决方案资源管理器”中可以看到如下图的目录。
![](http://img1.51cto.com/attachment/201309/200659148.jpg)
在工程里添加几个文件,Define.h,CFunction.h,CFunction.cpp,其内容如下所示:
//Define.h 用于导入dll的宏定义。
(3)在C#工程下使用生成的dll
新建一个C#的窗口工程,工程命名为“DllTest”,在新建的窗体工程中添加一个CFunction.cs的类,这个类主要是用于导出上面dll里的函数,废话不多说,直接贴代码:
//CFunction.cs dll的函数接口
//Form1.cs 在C#的窗体初始化函数添加测试代码
(4)总结
1)在书写dll导出函数时,变量的传递是关键,建议使用C++的基本类型,如int,float,double等,因为C#下指针的概念很纠结,在C++下的引用符“&”,在C#中则使用ref的标识,需要紧记的一点是,C#与C++的类型并不全然通用(结构对齐问题),注意做变换。像上面的testChar函数,原本string(C#)对应的是char*(C++),但可能由于各种Unicode或多字节的关系,我是没法返回正确的值,于是我采用了byte的传入类型。
2)观察我写的结构,在C++下使用的结构体,在C#必须要重新定义一次,使用 [StructLayout(LayoutKind.Sequential)] 的标识用于结构的对齐,如果你变量中使用了string这样的类型,还需要使用MarshalAs这样的方法支定义其长度——才可以跟char *相对应;
3)函数的返回值别用什么string了,最好使用ref的引用方法回传回来。
4)指针的参数的传递在C#下使用IntPtr类型作转换,这我先不细说,网上相关文章还是不少的。
示例源码连接:http://download.csdn.net/detail/fang1192801693/9309655
相关文章推荐
- 【C#】用组件的Anchor属性解决最大化组件的缩放问题
- C#与C++的混合编程 之一 方法介绍
- 【C#】文件选择对话框OpenFileDialog与下列列表ComboBox
- 【CS】——C#初识
- C#开篇
- WCF 之角色验证
- C#-高血压生活习惯数据模拟
- BC#64 4.Tree
- C#4.0之dynamic的使用
- C#程序从Excel表格中读取数据并进行处理
- C# 操作Excel
- C#—数据类型
- C#中的Contains与IndexOf的区别
- C#中使用split分割字符串的方法小结
- C#中struct与class的区别
- c#socket
- C#中DllImport用法汇总
- C#编程实现发送邮件的方法(可添加附件)
- C#实现两个窗体之间数值传送的方法
- C#interface