【发布时间】:2015-02-18 08:33:06
【问题描述】:
我想使用 Omron V4KU 的 API,文档描述如下:
原始c#代码:
const string DllLocation = @"..\..\Libs\Omron\OMCR.dll";
[DllImport(DllLocation)]
public static extern LPCOMCR OMCR_OpenDevice(string lpcszDevice, LPCOMCR_OPTION lpcOption);
public void Start()
{
var lpcOption = new LPCOMCR_OPTION();
var result = OMCR_OpenDevice(null, lpcOption); // error method's type signature is not pinvoke compatible
}
[StructLayout(LayoutKind.Sequential)]
public struct LPCOMCR
{
public string lpcszDevice;
public IntPtr hDevice;
public uint lpcDevice;
}
[StructLayout(LayoutKind.Sequential)]
public struct LPCOMCR_OPTION
{
public uint dwReserved0;
public uint dwReserved1;
public uint dwReserved2;
public uint dwReserved3;
}
如果我在编写代码时遗漏或错误? 对不起,我的英语不好。感谢您的帮助。
【问题讨论】:
-
OMCR_OPTION是一个联合体,您只在 C# 代码中声明了最后一个 (USB) 部分。 -
是的,我只声明了 USB,但在文档结构中只描述了 1 个结构。我应该同时使用吗? @格鲁
-
当然应该。如果您查看 C 中的
sizeof(OMCR_OPTION),您会看到它有 7 个 DWORDS 长(假设您的 LPVOID 也是 32 位的)。使用[StructLayout(LayoutKind.Explicit)]和FieldOffset属性来排列 C# 结构以匹配原生结构。 -
我来自这个链接social.msdn.microsoft.com/Forums/en-US/…,但是有些属性具有相同的名称,例如“dwReserved1”“dwReserved2”“dwReserved3”。怎么做才能避免出错?你能给我举个例子吗@Groo :)
-
字段名称并不重要,您可以将它们更改为您喜欢的任何名称(但您也可以嵌套结构以避免命名冲突,并且在编组时仍会获得类似联合的行为)。我在下面的答案中添加了一个示例。