2016-08-18 135 views
-1

林做的是重新编译executeables与modifyed IL代码的事情,需要得到操作码指令(无类,方法等只是说明) ,这样我可以只添加/替换它在方法中,然后重新编译它。我如何编译C#代码的IL代码指令

是有什么方法,我可以编译此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重组呢?

+3

如何使用C#编译器,然后反汇编? – thehennyy

+0

你可以编译C#代码,以便它只是内部的函数? – eim64

+1

那么你将有一个包含这种方法的类型。 – thehennyy

回答

2

如果你正在寻找一个工具,它可以告诉你的IL,您可以使用LINQPad

  1. 选择“C#语句”
  2. 键入代码
  3. 可选:按下按钮在窗口的右下角,选择是否要看到优化的IL或不
  4. 按F5 绿色执行按钮
  5. 选择IL标签

为您的代码的结果是:

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直接编译的代码,因为它不使用类型的完整的语法和成员,也因为它不宣布当地人。