C#调用C的动态链接库
1.C#调用C的动态链接库时的数据格式转换
参照文章:https://yq.aliyun.com/articles/678155
1.1 函数传参的数据类型转换
1.1.1 函数参数是普通的类型
1.1.2 函数参数是普通变量的指针
1.1.3 函数参数是结构体
1.1.4 定义的结构体中含有数组
1.1.5 函数参数是结构指针
1.1.5.1 适用于结构体指针不是另外一个函数的返回值
【DllImport("DLL文件名.DLL",EntryPoint = "函数名",CallingConvention = “DLL指定的调用方式”)】
public static extern UINT32 LTI5_MobusConnect(ref _tlink tlink,string strParm) ; //注意 _tlink是一个结构体
1.1.5.2 适用于传入的结构体指针是另外一个函数的返回值,该函数的返回值是结构体指针
【DllImport("DLL文件名.DLL",EntryPoint = "函数名",CallingConvention = “DLL指定的调用方式”)】
public static extern UINT32 LTI5_MobusConnect(IntPtr tlink,string strParm) ;
Note:一般来说,在使用DLL时,要明确CallingConvention的方式(四种)
2.C#调用DLL时常见错误
2.1 DLL和目标平台相冲突
调用DLL时要首先明确,调用的DLL适用于何种架构,是否与当前的目标平台,DeBug平台架构相一致
2.2 DLL之间架构不同相冲突
当调用多个DLL时,要保证DLL在是在同一架构下生成的。
2.3 DLL与.net的框架相冲突
这种情况遇到的很少,当初在使用大恒相机的DLL时,选择4.0的.net框架时,就会出现灰度图像竟然编程伪彩色,但是物体的大致轮廓可以识别。
基于以上问题:C#调用DLL时要做到:两明确,两统一
两明确:明确DLL的生成架构,明确DLL的调用方式
两统一:C#的Debug调试架构以及生成平台架构与引用的DLL的生成架构保持统一,调用的所有DLL生 成架构必须统一。