2013-03-28 1 views
1

액세스 제어 장치 (터미널)를 사용하고 있습니다. API는 기본입니다. 장치에 데이터를 보내려면 구조체 (API에서 제공)를 인스턴스화하고 [Marshal.StructureToPtr]을 사용하여 IntPtr로 변경 한 다음 해당 포인터를 API 함수에 전달합니다. 다음은 내가 작업중인 구조체입니다.Interop : 구조체 멤버 이름이 C# 키워드와 충돌 함 - 이벤트

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

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

주어진 구조체의 멤버 이름이 [이벤트] 키워드와 겹치는 것이 문제입니다. 회원 이름을 변경하면 기본 api에 대한 함수 호출이 실패합니다.

이겠습니까 :

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

내 문제를 해결? 아니면 다른 해결책이 있습니까?

답변

3

당신이 식별자로 키워드를 사용하는 @을 사용할 수 있습니다

[email protected] 

@은 실제로 식별자의 일부가 아닙니다.

당신은 "2.4.2 식별자"에서 C#을 사양에서 그것을 찾아 볼 수 있습니다 :

접두사는 "@"다른 프로그래밍 언어와 인터페이스 할 때 유용하다 식별자 같은 키워드의 사용을 가능하게 . 문자 @는 실제로 식별자의 일부가 아니므로 접두사가없는 식별자 이 다른 언어에서 일반 식별자로 표시 될 수 있습니다. @ 접두사가 붙은 식별자는 축 어적 식별자라고합니다. 키워드가 아닌 식별자에 @ 접두사를 사용하는 것은 허용되지만 스타일 문제로 사용하지 않는 것이 좋습니다.

+0

고맙습니다. 할 수있을 때마다 주로 언어 학습용 서적을 사용합니다.하지만이 규칙을 기억하지는 않습니다 ... 나는 rtfm에 대한 시간 인 것 같습니다. :). –

2

시도 그것의 앞에 @을 넣어 :

C 번호에서
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] 
ushort[] @event; 

, 당신은 다음과 같이이 분야에 액세스 할 :

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