有没有MSIL结果的工具

时间:2013-01-11 19:24:02

标签: c# compiler-optimization

我对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?

非常感谢参考资料和相关链接。

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

4 个答案:

答案 0 :(得分:1)

ReflectorILSpydotPeek和ildasm。

Reflexil是Reflector非常好的插件。但正如所写,Reflector现在已经付清了。

关于优化:

有优化的东西吗?您是否在项目属性中选中了“优化代码”? JIT编译器也进行了一些编译优化。您可以使用SOS扩展来获取方法的机器代码:

Retrieve JIT output

How do I see what the JIT compiled, anyway?

Debugging with SOS, SOSEX and Dumps in Visual Studio

答案 1 :(得分:1)

我会推荐Telerik JustDecompile。这将是“永远自由”。

历史上很长一段时间里,Lutz都有“The Reflector”    罗德。但现在由RedGate拥有。你仍然可以获得它    价格高昂。

答案 2 :(得分:0)

我推荐IlSpy,它是免费且可靠的

http://ilspy.net/

答案 3 :(得分:0)

ILSpy(http://ilspy.net/)很好且免费,如果你也想检查源代码。 反射器很好但不再免费(avec昂贵)。