사용자 정의 속성을 가진 멤버를 장식하기 위해 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) } }
위의 그림과 같이 ildasm의 출력은 배열이 이미 올바른 형식으로 변환되었지만 필수는 아니며 다른 형식/인수의 경우에는 다음 형식으로 제공 할 수도 있습니다.
= { string('Hello, World!') bool(true) type(int32) type([System.Xml]System.Xml.XmlDocument) }
그것들을 미리 포맷해야한다. – Jono읽을 수 없습니다. Ecma 335, 파티션 2, 21 장에서는 그렇게 할 수 없다고 말합니다. Ctor 데이터는 바이트 단위 여야합니다. 왜 다른 일을하는 데 어려움을 겪는 이유가 아마도 설명 할 수 있습니까? 디스어셈블러에 표시된 형식이 표준을 따랐다 고 가정하지 마십시오. –
사실, ECMA 표준은 내가 컨스트럭터 인수에 사용했던 간단한 형식에 대해서는 아무 것도 말하지 않습니다. ilasm.exe는 몇 가지 기본 유형 (문자열, int, bool, 유형 등)에는 문제가 없지만 비표준 형식으로 표시됩니다. – Jono