c# – 是否有MSIL结果的工具

我对MSIL的工作非常好奇.据我所知,在编译时CLR将其代码转换为MSIL,以便提供一些优化,稍后由JIT将其转换为机器代码.

例如,如果我们有:

    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?

非常感谢参考和相关链接.

附:

我写的使用,我们在上面看到:

    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看起来像是优化的一部分.我的目的是看某种方式C#代码或伪代码.

最佳答案 我推荐Telerik JustDecompile.这将是“永远自由”.

> http://www.telerik.com/products/decompiler.aspx

历史上很久以来,Lutz都有“The Reflector”
   罗德.但现在由RedGate拥有.你仍然可以获得它
   价格高昂.

> http://www.reflector.net/

点赞