2

我正在为我大学的化学系编写一个程序,其中包含三个独立的设备——一个力传感器、一个 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# 中工作。

我听说过诸如互操作、包装器、C++/CLI 之类的东西,但目前这有点超出我的理解(对所有这些来说仍然有些新),所以任何关于如何执行此过程的建议都会很棒。

谢谢你。

4

2 回答 2

4

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

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

AHANDLE是 avoid*或任何指针,因此通常用于在 C#IntPtr中表示 a 。HANDLE

Windows 数据类型页面列出了大多数 Windows 标准类型,这应该为确定所需的 P/Invoke 类型提供了一个很好的起点。

于 2013-07-10T17:00:58.690 回答
1

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

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

于 2013-07-10T17:11:28.923 回答