4

我对 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# 代码或伪代码。

4

4 回答 4

2

我会推荐 Telerik JustDecompile。它将是“永远免费”。

历史上很长一段时间都有 Lutz Roeder 的“The Reflector”。但这现在归 RedGate 所有。您仍然可以以高昂的价格获得它。

于 2013-01-11T19:33:41.793 回答
1

反射器ILSpydotPeek和 ildasm。

Reflexil是一个非常不错的 Reflector 插件。但正如所写的反射器现在是付费的。

关于优化:

有什么可以优化的吗?您是否在项目属性中检查了“优化代码”?JIT 编译器也做了一些编译优化。您可以使用 SOS 扩展获取方法的机器代码:

检索 JIT 输出

无论如何,我如何查看 JIT 编译的内容?

在 Visual Studio 中使用 SOS、SOSEX 和转储进行调试

于 2013-01-11T19:32:02.763 回答
0

我推荐 IlSpy,它免费且可靠

http://ilspy.net/

于 2013-01-11T19:28:02.083 回答
0

ILSpy (http://ilspy.net/) 很好而且免费,如果你愿意也可以查看源代码。反射器很好,但不再免费(价格昂贵)。

于 2013-01-11T19:30:31.507 回答