1

アクセス制御装置(端末)を扱っています。APIはネイティブです。データをデバイスに送信するには、(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識別子」の下のC#仕様で調べることができます:

接頭辞「@」を使用すると、キーワードを識別子として使用できます。これは、他のプログラミング言語とやり取りするときに役立ちます。文字 @ は実際には識別子の一部ではないため、識別子は他の言語では接頭辞なしの通常の識別子として表示される場合があります。@ 接頭辞が付いた識別子は逐語的識別子と呼ばれます。キーワードではない識別子に @ プレフィックスを使用することは許可されていますが、スタイルの問題として強くお勧めできません。

于 2013-03-28T08:21:04.253 に答える
2

その前に @ を入れてみてください:

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