2010-06-11 6 views
4

사용자 정의 속성을 가진 멤버를 장식하기 위해 CIL에서 배열 리터럴을 정의하는 구문은 무엇입니까?CIL에서 사용자 정의 속성 정의

저는 .NET 코드를 CIL (ilasm.exe를 사용하여 컴파일)에 작성하고 있으며 사용자 정의 속성으로 메소드를 꾸밀 필요가 있습니다. 이 속성의 생성자는 유일한 매개 변수로 정수 배열을 사용합니다. 어떻게 CIL에서 이것을 할 수 있습니까? 하지만 난 할 수 없습니다 (

public FooAttribute(int[] values) { 
// some hidden constructor stuff 
}

이 내가 C#으로 작성한다면 나는 내 방법을 장식 줄 방법은 다음과 같습니다

는 사용자 지정 특성의 생성자의 서명 (I는 변경할 수 없습니다)입니다) : 컴파일 된 C#을보고 Ildasm.exe를 사용


[Foo(new int[] {1, 2, 3, 4})] 
public string Bar() { 
    return "Some text"; 
}

은 (시도 및 리버스 엔지니어링으로 이해하기 위해) 나에게주는 추악한 및 문자 바이너리를 사용할 수 없게. 내가 대신 Reflector.NET를 사용하여 시도하고 훨씬 더 보이지만 키워드에 구문 오류가 Ilasm.exe를 던졌습니다 "새로운"그래서 그것을 사용할 수 없습니다 하드

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } } 

답변

3

당신의 문제가 무엇인지 추측 할 수 있습니다. 나는 Program.Test() 메서드에이 특성을 적용하면,이를 얻을 :

.method private hidebysig static void Test() cil managed 
    { 
    .custom instance void ConsoleApplication1.FooAttribute::.ctor(int32[]) = (01 00 04 00 00 00 01 00 00 00 02 00 00 00 03 00 
                       00 00 04 00 00 00 00 00) 
    // Code size  2 (0x2) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ret 
    } // end of method Program::Test 

실행이 Ilasm.exe를 통해, 아무 문제. 배열 요소 값 (미리보기 창을보기 위해 오른쪽으로 스크롤)이 이미 속성 생성자 데이터 테이블에 삽입하는 데 필요한 형식으로 변환되었는지 확인합니다. BitConverter.GetBytes()는 해당 작업의 일부를 완료 할 수 있습니다. Ecma 문서는 해당 데이터의 필수 형식을 가져야합니다.

+0

위의 그림과 같이 ildasm의 출력은 배열이 이미 올바른 형식으로 변환되었지만 필수는 아니며 다른 형식/인수의 경우에는 다음 형식으로 제공 할 수도 있습니다. = { string('Hello, World!') bool(true) type(int32) type([System.Xml]System.Xml.XmlDocument) } 그것들을 미리 포맷해야한다. – Jono

+2

읽을 수 없습니다. Ecma 335, 파티션 2, 21 장에서는 그렇게 할 수 없다고 말합니다. Ctor 데이터는 바이트 단위 여야합니다. 왜 다른 일을하는 데 어려움을 겪는 이유가 아마도 설명 할 수 있습니까? 디스어셈블러에 표시된 형식이 표준을 따랐다 고 가정하지 마십시오. –

+0

사실, ECMA 표준은 내가 컨스트럭터 인수에 사용했던 간단한 형식에 대해서는 아무 것도 말하지 않습니다. ilasm.exe는 몇 가지 기본 유형 (문자열, int, bool, 유형 등)에는 문제가 없지만 비표준 형식으로 표시됩니다. – Jono