2012-02-22 41 views
5

檢索代碼,我有寫一些函數來創建使用的ILGenerator一個exe文件。我想要的是向用戶展示IL語言,而不是使用ILDasm或Reflector等外部工具生成。從的ILGenerator

在執行我的程序期間我已經將每個OpCode添加到ILGenerator中,因此我可以使用帶有OpCode表示的字符串將每個OpCode保存在列表中,但我希望直接獲取IL代碼。可以做到嗎?

重要:我使用的是單聲道2.6。

+3

Mono.Cecil能對這些類問題的標準答案。 – 2012-02-22 12:55:09

回答

3

As Hans Passant and svick曾經說過,答案是Mono.Cecil。讓我們看看:

using Mono.Cecil; 
using Mono.Cecil.Cil; 

[...] 


public void Print() { 
    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(this.module_name); 

    int i = 0, j = 0; 
    foreach (TypeDefinition t in assembly.MainModule.Types) { 
     if (t.Name == "FooClass") { 
      j = i; 
     } 
     i++; 
    } 

    TypeDefinition type = assembly.MainModule.Types[ j ]; 

    i = j = 0; 
    foreach (MethodDefinition md in type.Methods) { 
     if (md.Name == "BarMethod") { 
      j = i; 
     } 
     i++; 
    } 

    MethodDefinition foundMethod = type.Methods[ j ]; 

    foreach(Instruction instr in foundMethod.Body.Instructions) { 
     System.Console.WriteLine("{0} {1} {2}", instr.Offset, instr.OpCode, instr.Operand); 
    } 
} 

確定它可以做得更高效但它解決了我的問題。

+0

我認爲你的代碼可以很容易地用LINQ和'Single()'重寫成更易讀。 – svick 2012-02-27 15:05:33

5

如果您有MethodBuilder,您應該可以使用builder.GetMethodBody().GetILAsByteArray()將IL作爲byte[]。但要想明白這一點,你需要以某種方式解析它。

所以,更好的選擇可能是使用​​,它可以給你以可讀格式的程序集的IL代碼。

相關問題