您的位置:首页 > 编程语言 > C#

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,只是在工程的配置里修改是根本没有用的,必做要重建工程。





(2)实现dll导出的函数

新建好工程后,在VS的“解决方案资源管理器”中可以看到如下图的目录。





在工程里添加几个文件,Define.h,CFunction.h,CFunction.cpp,其内容如下所示:

//Define.h 用于导入dll的宏定义。

//CFunction.h 函数定义,这里我特意定义了一组结构,我的用意稍后再讲。

//CFunction.cpp dll函数的实现。

添加好代码之后,选择“生成”的选项,因在工程目录下的Debug文件就已经存在我们所需要的MyNativeDll.dll文件,一起的还有lib的静态库文件(稍后要用到),及其他相关的调试文件,至此,我们已经成功的生成了native C++的动态链接库,我只能说,这是相当简单的第一步在而已。

(3)在C#工程下使用生成的dll

新建一个C#的窗口工程,工程命名为“DllTest”,在新建的窗体工程中添加一个CFunction.cs的类,这个类主要是用于导出上面dll里的函数,废话不多说,直接贴代码:

//CFunction.cs dll的函数接口

上面的做法相当是作了一个CFunction的静态类而已。然后在Form1.cs窗体里直接写测试代码,我是直接写在Form1的初始化函数里。

//Form1.cs 在C#的窗体初始化函数添加测试代码

在你进行调试之前,务必记得要将在第二步生成的MyNativeDll.dll拷贝至C#工程下的bin\Debug\目录下,然后点击“调试”,看输出窗口,应该会有东西输出的,我就不贴出来了。

(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: