C#和VC++调用dll详细过程,导出导入函数数据类型对应关系,返回字符串实现方式
一、VC DLL接口定义
以开发浮云绘图组件FYDC.dll为例,FYDC.dll是VC MFC动态链接库,有多个类库组成,其中包含MFC类和窗体、图标等资源。编码定义及过程如下:
1. 创建MFC常规动态链接库dll工程FYDC;
2. 实现CSLine画线、CSEllipse画圆等类,实现画布CCanvasWnd等所有绘图功能;
3. 在FYDC.h和FYDC.cpp添加绘图类库头文件,如CanvasWnd.h, SLine.h等;
4. 在FYDC.cpp定义导出接口(部分接口如下),并并实现。
5. 编译生成FYDC.dll和FYDC.lib,即完成dll开发,以供第三方工程复用。
二、C#使用dll详细步骤
1. 新建C#工程,复制FYDC.dll到生成的exe目录;
2. 在C#代码文件,添加FYDC.dll导入函数声明。与上面7个导出函数对应的C#版导入函数声明如下:
DLL导出函数类型 对应 C#导入函数类型
函数返回值 CCanvas* 函数返回值 IntPtr
函数形参 CSLine* 函数形参 IntPtr
函数形参 HWND 函数形参 IntPtr
函数返回值或形参 int 函数返回值或形参 int
函数形参 &int 函数形参 ref int
函数形参 const char* 函数形参 string
函数形参 char* 函数形参 ref byte
注意:当函数dll形参时传出字符串时,字符串需要深拷贝,才能正确返回给C#
DLL返回字符串函数实现如下:
在C#项目中,正确使用该接口示例如下:
当C#读取dll中文是乱码时,是因为双方编码约定未统一,此时应该:
① dll工程设置为多字节编码
②dll接口实现char*改成wchar_t*,并且调用MultiByteToWideChar函数转码
③C#导入函数形参不变,只需转码时Encoding.Default改成Encoding.Unicode
3. 在其他C#代码文件里直接引用此处的导出函数既可。
三、VC使用dll详细步骤
1. 新建VC++工程,复制FYDC.dll到生成的exe目录,并复制FYDC.lib到工程源码目录(不是exe目录);
2. 在VC代码文件,添加#pragma comment(lib,"FYDC.lib"),增加新类型导出声明,以及函数导出声明。与上面7个导出函数对应的C#版导入函数申明如下:
因为dll就是C++写的,那么VC工程引用的导出函数声明,是一样的。
3. 在VC代码文件直接调用已声明的dll的函数。