我正在使用门禁控制设备(终端)。 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;
解决我的问题?或者还有其他解决方案吗?
答案 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;