1

我正在使用访问控制设备(终端)。API 是原生的。要将数据发送到设备,我实例化 struct(由 API 提供),使用 [Marshal.StructureToPtr] 将其更改为 IntPtr,然后将该指针传递给 API 函数。这是我正在使用的结构。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct NameOfTheStruct
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    ushort[] event;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    ushort[] someName;
};

问题是给定结构中的成员名称与 [event] 关键字重叠。如果我更改成员名称,我猜对本机 api 的函数调用将失败。

这会:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
[ComAliasName("event")]
ushort[] eventName;

解决我的问题?或者还有其他解决方案吗?

4

2 回答 2

3

您可以@使用关键字作为标识符:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
ushort[] @event;

在 C# 中,您可以像这样访问该字段:

yourInstance.@event

@但这实际上并不是标识符的一部分 。

您可以在“2.4.2 Identifiers”下的 C# 规范中查找它:

前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符 @ 实际上不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀。带有@ 前缀的标识符称为逐字标识符。允许对不是关键字的标识符使用 @ 前缀,但出于风格问题强烈建议不要使用。

于 2013-03-28T08:21:04.253 回答
2

尝试将 @ 放在它前面:

 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
 ushort[] @event;
于 2013-03-28T08:20:04.117 回答