2013-01-11 33 views
4

我對MSIL工作非常好奇。據我瞭解,在編譯時CLR將其代碼轉換爲MSIL,以便提供一些優化,稍後由JIT轉換爲機器代碼。是否有MSIL結果工具

例如,如果我們有:

using (TextWriter w = File.CreateText("log.txt")) 
{ 
    w.WriteLine("This is line one"); 
} 

將翻譯成MSIL下面的代碼:

TextWriter w = File.CreateText("log.txt"); 
    try 
    { 
     w.WriteLine("This is line one"); 
    } 
    finally 
    { 
     bool flag = w == null; 
     if (!flag) 
     { 
      w.Dispose(); 
     } 
    } 

我不知道這是否會轉換完全一樣的,但肯定對類似的東西。

重點是,我試圖調查MSIL優化。 直到這一點,我發現MSIL轉換爲asm代碼,這對我來說是不可讀的。

是否有任何工具可以顯示我在C#代碼或甚至僞代碼中翻譯的MSIL?

高度讚賞參考文獻和相關鏈接。

P.S.

我寫的使用,我們看到上面:

using (TextWriter w = File.CreateText("log.txt")) 
{ 
    w.WriteLine("This is line one"); 
} 

並編譯它。然後,我使用Reflector查看代碼,並看到了我編寫的相同代碼,以便查看某些優化。

我用相同的代碼LINQPad。我發現,MSIL輸出是:

IL_0001: ldstr  "log.txt" 
IL_0006: call  System.IO.File.CreateText 
IL_000B: stloc.0  // w 
IL_000C: nop   
IL_000D: ldloc.0  // w 
IL_000E: ldstr  "This is line one" 
IL_0013: callvirt System.IO.TextWriter.WriteLine 
IL_0018: nop   
IL_0019: nop   
IL_001A: leave.s  IL_002C 
IL_001C: ldloc.0  // w 
IL_001D: ldnull  
IL_001E: ceq   
IL_0020: stloc.1  // CS$4$0000 
IL_0021: ldloc.1  // CS$4$0000 
IL_0022: brtrue.s IL_002B 
IL_0024: ldloc.0  // w 
IL_0025: callvirt System.IDisposable.Dispose 
IL_002A: nop   
IL_002B: endfinally 

從這個代碼中,我們看到System.IDisposable.Dispose它看起來像optimization.My意圖的一部分就是看莫名其妙的C#代碼或僞代碼。

+0

並不清楚你在找什麼 - 反射/ ILSpy將反編譯IL到C#,但不知道它是如何幫助IL本身的理解。 –

+0

反射器顯示我沒有任何優化我寫的相同的代碼。我寫道:使用(TextWriter w = File.CreateText(「log.txt」)) { w.WriteLine(「This is line one」);這正是他給我看的 } – Jviaches

+0

下面提到的很多工具實際上都會隱藏優化的事實。他們知道如何識別特定的優化並將反編譯的C#恢復爲原始形式。如果你真的想學習C#編譯器如何優化IL,請學習IL。這並不難。只要在網上逐一查看每條命令,並在幾個小時內獲得足夠的理解即可閱讀。你也可以進一步看看x86彙編代碼。 – Dennis

回答

0

ILSpy(http://ilspy.net/)是優秀且免費的,如果你想太多,你可以查看源代碼。 反射器是好的,但不再免費(avec昂貴)。