2012-03-10 3 views
5

최신 버전의 .NET Framework 버전 4.5에서 MethodBuilder 클래스에는 SetMethodBody이라는 메서드가 있습니다.이 메서드는 ILGenerator를 사용하는 대안으로 생각합니다. 성가신 및 이상한 방법으로 제한). 이 설명서는 here으로 볼 수 있지만 .NET 4.5가 아직 출시되지 않았기 때문에 문서화되지 않았습니다. 나는 두 가지를 제외한 모든 것을 제공 할 수 있지만 나머지는 도움이 필요할 것입니다..NET 4.5 MethodBuilder.SetMethodBody

처음 이해할 수없는 것은 byte[] localSignature, 세 번째 인수입니다. MSDN은 "직렬화 된 로컬 변수 구조를 포함하는 바이트 배열입니다. 메서드에 로컬 변수가 없으면 null을 지정하십시오." 문제는 그게 전부입니다. "직렬화 된 지역 변수 서명"형식을 찾을 수 없습니다. ECMA-335 스펙을 살펴 보았습니다 만, 어셈블리 언어가 아닌 CIL에서 지역 변수를 지정하는 방법을 찾았습니다. 아무도 내가 이것을 이해하도록 도와 줄 수 없다면 많은 도움이 될 것입니다.

또한 마지막 인수는 "수정 될 수있는 토큰의 시작을 지정하는 오프셋을 나타내는 값의 집합 인 IEnumerable<int> tokenFixups입니다. 메서드에 토큰이 없으면 null을 지정하십시오. 수정. " 나는 이것을 사용할 필요가 없다고 생각하지만, 어쨌든 그들이 무엇인지 알고 싶습니다.

감사합니다, 브랜든

+5

SignatureHelper 클래스가 필요합니다. 픽스 업은 C++/CLI와 같이 네이티브 코드를 IL로 변환하는 컴파일러에만 해당됩니다. –

+0

@ 한자 Passant : 답변 주셔서 감사합니다! :) – aboveyou00

답변

4

내 질문에 진짜 대답은 지금이 질문이 경우 다른 사람의 ... 그래서 여기에 게시 된 대답 대신 답변의 댓글로 게시했습니다 :

SignatureHelper 클래스가 필요합니다. 픽스 업은 C++/CLI와 같이 네이티브 코드를 IL로 변환하는 컴파일러에만 해당됩니다. - Hans Passant 13시 2분

에서 3월 10일 그래서 ... 로컬 서명을위한 바이트 배열을 얻기 위하여, 당신은이 코드를 실행할 수 있습니다

var sig = SignatureHelper.GetLocalVarSigHelper(this.module); 
sig.AddArgument(typeof(int)); //Local #0 is of type int 
... 
sig.AddArgument(typeof(string)); //Local #n is of type string 
var sigArray = sig.GetSignature(); 

을 그리고 방법을 설정하기 위해 MethodBuilder 바디, 당신은 위원장이 유효 IL 지침 (this page 참조)와 byte[]입니다

MethodBuilder.SetMethodBody(il, maxStack, sigArray, handlers, fixups); 

... 전화 MAXSTACK는 스택에 예약하는 지점의 수와 정수이다 방법에 대해, 핸들러는 System.Reflection.Emit.ExceptionHandler[]이며, 픽스 업이 무시 될 수있는 int[] 배열입니다 (하나를 제외하고는 아래를 참조하십시오.)

내가 한스 옆모습의 의견에 동의 한 것은 픽스 업이 컴파일러를위한뿐만 아니라 점이다 원시 코드를 IL로 변환합니다. 이 작업을 할 때 MethodBuilder 메서드 호출을 발생 시키려고하면 잘못된 지시문이 방출된다는 것을 발견했습니다. .NET reflector에서 ILGenerator를 보면 메소드 호출을 할 때마다 픽스 업을 내 보낸다는 것을 알게되었습니다. 각 메서드 호출에 대한 픽스 업을 추가하면 실제로이 문제가 해결되었습니다. 제대로 작동하려면 픽스 업을 내야하는 다른 장소가있을 수 있지만 그다지 보지 못했습니다.