在C#程序中使用用C ++编写的DLL

时间:2013-07-10 16:57:47

标签: c# dll interop wrapper

我正在为我的大学化学系编写一个程序,包括三个独立的设备 - 力传感器,Z轴纳米定位器平台和XYZ轴微动机平台。我必须将这三个设备合并到一个程序中,并让它们相互通信。我已经成功地将力传感器和Z轴平台结合在一起。他们都带有为C#准备的DLL。由于我正在编写一个GUI程序,而且我已经非常熟悉C#,这是很自然的选择。

然而,XYZ阶段的DLL是为C ++编写的。我不确定如何让这个DLL在我的程序中工作。我无法在Visual Studio中添加对它的引用,因为它不兼容,并且随其附带的用于暴露DLL中的函数的头文件是为C ++编写的。

我对这个过程有基本的了解。在ldcncom.h头文件中,有一个函数编写如下:

DLLENTRY(int)  LdcnInit(char *portname, unsigned int baudrate);

我在C#程序中重写了它:

[DllImport("Ldcnlib.dll", EntryPoint = "LdcnInit")]
public static extern int LdcnInit(char[] portname, uint baudrate);

我不确定这是否正确,但它“工作”,因为它能够从DLL中读取函数并履行它的职责......只是不完全正确,因为它仍然缺少所有其他函数。

但我不知道如何做其余的事情。例如,在sio_util.h中,有一个返回类型为HANDLE的函数,另一个返回类型为DWORD的函数,我对它们不是很熟悉,也不知道如何使它在C#中工作。

我听说过像interop,wrappers,C ++ / CLI这样的东西,但是目前这还有点超出我的想法(对于所有这些来说还是有些新的),所以关于如何做这个过程的任何建议都会很棒。

谢谢。

2 个答案:

答案 0 :(得分:4)

  

但我不知道如何做其余的事情。例如,在sio_util.h中,有一个返回类型为HANDLE的函数,另一个返回类型为DWORD的函数,我对它们不是很熟悉,也不知道如何使它在C#中工作。

DWORD是一个32位无符号整数,因此您可以使用UInt32uint)来表示它。

HANDLEvoid*或任何指针,因此您通常使用IntPtr来表示C#中的HANDLE

Windows Data Types页面列出了大多数Windows标准类型,这应该是找出你需要的P / Invoke类型的一个很好的起点。

答案 1 :(得分:1)

如果你需要将更多的C ++数据类型转换为C#并且发现它很耗时,那么有很棒的工具“P / Invoke Signature Generator”可以让这项工作变得简单。 Here是关于如何使用它的好文章。

您必须复制本机方法签名,该工具才会生成C#签名。