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函数传递的参数是否有问题。

具体操作详见这篇博客>>地址

原文地址:https://www.cnblogs.com/hujun1992/p/CSharpInvokeDll.html