글쎄, 개인적으로 항상 적절한 매개 변수를 사용하여 opcode와 동일한 이름을 가진 ILGenerator
클래스의 확장 메소드를 만들었으므로 항상 문서를 조회 할 필요가 없습니다. 이러한 확장 메서드는 호출 된 생성기 개체도 반환하므로 호출 체인을 수행 할 수 있습니다.
예를 들어, ToString 메서드를 구현하기 위해, 나는이 작업을 수행 할 수 있습니다 :
var il = method.GetILGenerator();
il
.ldarg_0()
.ldfld(nameField)
.ret();
나는 또한 IL.Element 개체를 반환 방법을 가지고 IL라는 이름의 유사한 클래스를, 만든 어떤 I 마침내 코드를 방출하기 전에 콜렉션 또는 유사한 것으로 수집하여 조작 할 수 있습니다. 이를 통해 "코드 생성자"뿐만 아니라 "코드 생성자"를 만들 수 있습니다. 미묘한 차이가 있지만, "내가 낼 수있는 코드를 내게주세요"라는 것이 "이 ILGenerator에 코드를 내 보냅니다"보다 유용하다는 것을 알았습니다. 따라서
, 나는이 작업을 수행 할 수 있습니다 : 다음
IL.Element[] il = new IL.Element[] {
IL.ldarg_0(),
IL.ldfld(nameField),
IL.ret()
};
과 :
method.GetILGenerator.Emit(il); // also an extension method
은 물론, 나는 나뿐만 아니라 코드를 방출하는 것이 쉽게 몇 가지 추가 확장 메서드를 추가했습니다 "call_smart"와 같이 메소드의 유형 (정적, 가상 등)을 기반으로 방출 할 호출 명령어를 결정합니다.
그 외의 다른 도구에 대해서는 알지 못해서 아마도 귀하의 질문에 답변하지 못했을 것입니다.
The code is available on CodePlex.
이것을 Reflection.Emit과 결합 할 수 있습니까? – SLaks
SLaks : 예, 예를 들어, Reflection.Emit에서 유형을 생성하고 MethodBuilder를 사용하여 메소드를 작성한 다음 메소드의 ILGenerator를 사용하여 컴파일 된 표현식 트리를 호출 할 수 있습니다. 이를 수행하는 간단한 방법이있을 수 있지만 이는 효과가 있습니다. –