C#调用C++动态库
这是关于一个精密设备的上位机,设备提供了封装好的动态库文件Sense2020Dll.dll文件,还给了一个用MFC建的示例。
我尝试使用MFC单文档方式建立文件,以后再写这个。今天把遇到的问题及解决的方法写一下。
1.如何引入动态库DLL
使用System.Runtime.InteropServices类,调用DLL,EntryPoint输入函数名。
1 [DllImport("Sense2020Dll.dll", EntryPoint = "DLL_Open_Device")] 2 private static extern bool DLL_Open_Device();
2.关于数据类型的转换
说一下自己遇到的类型转换
C++ | C# |
boolean |
bool |
int *dllVersion |
ref int dllVersion |
string deviceSN |
intPtr deviceSN |
byte sensorMode |
byte sensorMode |
double *pdblTemp |
ref double pdblTemp |
doube *pdblPower |
[MarshalAs(UnmanagedType.LPArray, SizeConst = 512)] double[] pdblPower |
在转换string类型时,使用到了intPtr指针,在处理得到的结果时还要写如下语句:
1 IntPtr intptr = Marshal.StringToHGlobalAnsi("test"); 2 DLL_Get_Device_SN(intptr); 3 deviceSN = Marshal.PtrToStringAnsi(intptr);
对于最后一个类型转换,在C++函数中要传入double数组的指针并赋值,用到C#里面是没有的,需要用到marshal数组。
具体请参考【http://www.kycis.com/blog/read.php?21】
具体请参考【http://www.kycis.com/blog/read.php?20】
3.其他
3.1 C#跨线程调用控件问题
可以直接加入一条语句:
Control.CheckForIllegalCrossThreadCalls = false;
还有更好的办法,具体这篇文章很好,C# 跨线程调用控件。
3.2 实现底部状态栏时间显示,分栏效果
关键点:将Sprint属性为True,BorderSides属性为Left,Right
具体操作详见这篇博客>>地址
3.3 C#尝试读取或写入受保护的内存,这通常指示其他内存已损坏
先检查DLL函数传递的参数是否有问题。
具体操作详见这篇博客>>地址