Interop:struct member name与c#keyword - event冲突

时间:2013-03-28 08:18:21

标签: c# .net interop

我正在使用门禁控制设备(终端)。 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;

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

2 个答案:

答案 0 :(得分:3)

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

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

从C#开始,您将按如下方式访问此字段:

yourInstance.@event

@实际上不会成为标识符的一部分。

您可以在“2.4.2标识符”下的C#规范中查找:

  

前缀“@”允许使用关键字作为标识符,即   在与其他编程语言交互时很有用。该   character @实际上不是标识符的一部分,所以标识符   可能在其他语言中看作普通标识符,没有   字首。带有@前缀的标识符称为逐字   标识符。将@前缀用于非关键字的标识符   是允许的,但强烈劝阻作为一种风格问题。

答案 1 :(得分:2)

尝试将@放在前面:

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