저는 특수 목적의 미니 컴파일러를 작성하고 있으며, 종종 작업을 수행하는 방법을 파악하기 위해 디스 어셈블 된 CIL을 봅니다. 그러나 해체 된 코드를 Reflection.Emit 호출로 변환하는 방법이 명확하지 않은 경우가 종종 있습니다. 참조 설명서가 있습니까? 아니면이 번역을하기위한 다른 정보 출처입니까?일반적으로 ilasm 구문을 Reflection.Emit 호출로 변환하는 방법은 무엇입니까?
편집 : 예, ILGenerator에 opcode를 매핑하는 것은 매우 간단합니다. 나는 지시어와 속성과 같은 다른 모든 것들을 말하고 있습니다. 예를 들어, Dictionary<TKey,TValue>
과 같은 Reflection.Emit 동등 물을 작성하는 방법을 어떻게 알 수 있습니까?
.class public auto ansi serializable beforefieldinit Dictionary<TKey, TValue>
extends System.Object
implements System.Collections.Generic.IDictionary`2<!TKey, !TValue>,
System.Collections.Generic.ICollection`1<valuetype
System.Collections.Generic.KeyValuePair`2<!TKey, !TValue>>,
...
{
.custom instance void System.Diagnostics.DebuggerDisplayAttribute::
.ctor(string) = { string('Count = {Count}') }
.method public hidebysig newslot virtual final instance bool TryGetValue
(!TKey key, [out] !TValue& 'value') cil managed
{
.maxstack 3
.locals init ([0] int32 num)
...
"param"지침은 어떻습니까?
// public static void SayHello(string s = "Hello World!")
.method public hidebysig static void SayHello([opt] string s) cil managed
{
.param [1] = "Hello World!"
OpCodes 클래스가 일대일 매핑이 아닙니까? http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.aspx –
당신이하는 일에 따라 표현식 트리를 사용하는 것이 훨씬 쉽습니다. 그런 다음 표현식 트리를 CIL : http://msdn.microsoft.com/en-us/library/bb397951.aspx – porges
식 트리는 주로 클래스 및 메서드의 메타 데이터를 작성하는 것이 아니라 건물 식을 주로 사용합니다. 후자를 생성하는 방법을 알고 싶기 때문에이 질문을했습니다. (아직 .NET 4를 사용하고 있지는 않지만 Expression Tree는 .NET 4에서 다소 확장되었다고 들었습니다.). – Qwertie