[学习记录] 使用C#语言调用.dll(动态链接库)文件
感谢大家的博客教会了我很多,我也要写出来参与社区建设.
嘛不一定完全正确,想要可靠性比较高的同志建议买书,书中出处啥的比较详细,可靠性比较高.
---------------------
1.基本步骤
1.1 向项目中导入dll文件
1.2 阅读dll文件的使用手册 [ 和头文件(.H) ]
1.3 编写导入dll文件中方法的代码
1.4 编写读取dll中对应数据的代码(可能略)
1.5 写方法调用dll中方法并加以判断调用是否成功
1.6 在相关位置调用使用自己定义的调用方法
2.基本实现:
2.1 向项目中导入dll文件
复制dll文件(ctrl+c) > 打开vs项目对应处粘贴(ctrl+v)
2.2 阅读dll文件的使用手册 [ 和头文件(.H) ]
打开: 双击PDF等类型的使用手册 || 右键打开方式使用记事本打开头文件(||直接用vs打开)
查阅:定义+函数列表+函数说明等 || 功能+输入+输出+返回值
2.3 编写导入dll文件中方法的代码
例子:
[DllImport("lib/NAME.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "Open")]
public static extern int Open(int a, int b);
解读:
[ ]:特性,为程序集添加额外说明信息的文件 (详情搜索:C#特性)
DllImport: dll文件导入(import)
// EntryPoint:设置调用函数的名字,若没有,extern后的名字作为默认的函数名
// ChartSet:传送字符串数据的字符集,Ansi,默认值,会影响文本参数的封送处理;Auto:可以使CLR根据当前操作系统使用适当的字符集,Unicode:基于Window NT,并只支持Unicode,就用Unicode// SetLastError:是否遇到任何错误都应传送,通过调用Mashell.GetWin32Error()方法检查可用性
// CallingConvention:StdCall:由被调用都清理栈资源,调用native函数时的默认方式;(来自一起实习的小伙伴,是的就是你,没错就是我)
模式:
[DllImpor("详情搜路径/.dll"),详情搜DllImpor参数]
public static extern 返回值类型 方法名(参数类型 参数名);
详细用法拓展等暂略,请自行搜索
解疑:
(为纸上谈兵者)
方法和参数 参考上一步的手册和头文件编写即可
参考:
[链接]C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值
2.4 编写读取dll中对应数据的代码(可能略)
可能用到结构体,新建类将获取数据的属性写入
dll为C++,现在用C#的可参考:[链接]C#调用C++dll,C++中char*与C#类型的对应关系
2.5 写方法调用dll中方法并加以判断调用是否成功
善用if-else等,结合手册编写
接收返回值数据并对其进行判断等
2.6 在相关位置调用使用自己定义的调用方法
对照手册,利用手册使用方法,注意使用顺序等
3.细节处理
3.1 向项目中导入dll文件
注意: ① 右键属性||选中>视图>属性窗口;
② 始终复制; 如图:
避免出现此错误(在路径写正确了的情况下):[链接]无法加载 DLL“lib/xxx.dll
3.2 编写导入dll文件中方法的代码
注意: 如果手册等中传入参数为指针类型等,要注意C#语言中的数据类型与其它语言数据类型的转换