檢索代碼,我有寫一些函數來創建使用的ILGenerator一個exe文件。我想要的是向用戶展示IL語言,而不是使用ILDasm或Reflector等外部工具生成。從的ILGenerator
在執行我的程序期間我已經將每個OpCode添加到ILGenerator中,因此我可以使用帶有OpCode表示的字符串將每個OpCode保存在列表中,但我希望直接獲取IL代碼。可以做到嗎?
重要:我使用的是單聲道2.6。
檢索代碼,我有寫一些函數來創建使用的ILGenerator一個exe文件。我想要的是向用戶展示IL語言,而不是使用ILDasm或Reflector等外部工具生成。從的ILGenerator
在執行我的程序期間我已經將每個OpCode添加到ILGenerator中,因此我可以使用帶有OpCode表示的字符串將每個OpCode保存在列表中,但我希望直接獲取IL代碼。可以做到嗎?
重要:我使用的是單聲道2.6。
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);
}
}
確定它可以做得更高效但它解決了我的問題。
我認爲你的代碼可以很容易地用LINQ和'Single()'重寫成更易讀。 – svick 2012-02-27 15:05:33
如果您有MethodBuilder
,您應該可以使用builder.GetMethodBody().GetILAsByteArray()
將IL作爲byte[]
。但要想明白這一點,你需要以某種方式解析它。
所以,更好的選擇可能是使用,它可以給你以可讀格式的程序集的IL代碼。
Mono.Cecil能對這些類問題的標準答案。 – 2012-02-22 12:55:09