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的函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用