我對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#代碼或僞代碼。
並不清楚你在找什麼 - 反射/ ILSpy將反編譯IL到C#,但不知道它是如何幫助IL本身的理解。 –
反射器顯示我沒有任何優化我寫的相同的代碼。我寫道:使用(TextWriter w = File.CreateText(「log.txt」)) { w.WriteLine(「This is line one」);這正是他給我看的 } – Jviaches
下面提到的很多工具實際上都會隱藏優化的事實。他們知道如何識別特定的優化並將反編譯的C#恢復爲原始形式。如果你真的想學習C#編譯器如何優化IL,請學習IL。這並不難。只要在網上逐一查看每條命令,並在幾個小時內獲得足夠的理解即可閱讀。你也可以進一步看看x86彙編代碼。 – Dennis