2016-08-18 121 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直接編譯的代碼,因爲它不使用類型的完整的語法和成員,也因爲它不宣佈當地人。