car*_*esh 5 .net c# mono command-line-interface ilgenerator
我已经编写了一些函数来使用ILGenerator创建一个exe文件.我想要的是向用户展示使用ILDasm或Reflector等外部工具生成的IL语言.
在我的程序执行期间,我已将每个OpCode添加到ILGenerator,因此我可以使用带有OpCode表示的字符串将每个OpCode保存在列表中,但我希望直接获取IL代码.可以吗?
重要提示:我使用的是Mono 2.6.
如果你有MethodBuilder
,你应该可以builder.GetMethodBody().GetILAsByteArray()
用来获得IL作为byte[]
.但要明白这一点,你需要以某种方式解析它.
因此,更好的选择可能是使用Mono Cecil,它可以以可读格式为您提供程序集的IL代码.
正如Hans Passant和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 );
}
}
Run Code Online (Sandbox Code Playgroud)
当然,它可以做得更有效,但它解决了我的问题。
归档时间: |
|
查看次数: |
1051 次 |
最近记录: |