我如何编译c#代码到IL代码指令

时间:2016-08-18 18:47:46

标签: c# cil

我做了一个用修改过的IL代码重新编译可执行文件的东西,需要得到OPcode指令(没有类,方法等只是指令) 这样我就可以在方法中添加/替换它,然后重新编译它。

在某种程度上我可以编译这个c#代码:

int a = 5;
int b = 24;
Console.WriteLine("{0} * {1} = {2}",a,b,a*b);

到il代码:

.entrypoint
// Code size       38 (0x26)
.maxstack  5
.locals init ([0] int32 a,
         [1] int32 b)
IL_0000:  nop
IL_0001:  ldc.i4.5
IL_0002:  stloc.0
IL_0003:  ldc.i4.s   24
IL_0005:  stloc.1
IL_0006:  ldstr      "{0} * {1} = {2}"
IL_000b:  ldloc.0
IL_000c:  box        [mscorlib]System.Int32
IL_0011:  ldloc.1
IL_0012:  box        [mscorlib]System.Int32
IL_0017:  ldloc.0
IL_0018:  ldloc.1
IL_0019:  mul
IL_001a:  box        [mscorlib]System.Int32
IL_001f:  call       void [mscorlib]System.Console::WriteLine(string,
                                                              object,
                                                              object,
                                                              object)
IL_0024:  nop
IL_0025:  ret

这样我可以替换它并用ilassem重新组装它?

1 个答案:

答案 0 :(得分:2)

如果您正在寻找可以向您显示IL的工具,您可以使用LINQPad

  1. 选择“C#语句”
  2. 输入您的代码
  3. 可选:按下窗口右下角的按钮,选择是否要查看优化的IL
  4. F5 或绿色的执行按钮
  5. 选择IL选项卡
  6. 您的代码的结果是:

    IL_0000:  nop         
    IL_0001:  ldc.i4.5    
    IL_0002:  stloc.0     // a
    IL_0003:  ldc.i4.s    18 
    IL_0005:  stloc.1     // b
    IL_0006:  ldstr       "{0} * {1} = {2}"
    IL_000B:  ldloc.0     // a
    IL_000C:  box         System.Int32
    IL_0011:  ldloc.1     // b
    IL_0012:  box         System.Int32
    IL_0017:  ldloc.0     // a
    IL_0018:  ldloc.1     // b
    IL_0019:  mul         
    IL_001A:  box         System.Int32
    IL_001F:  call        System.Console.WriteLine
    IL_0024:  nop         
    IL_0025:  ret
    

    请注意,这不是可以使用ilasm直接编译的代码,因为它不使用类型和成员的完整语法,也因为它没有声明本地。