是否有针对MSIL结果的工具?

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被翻译为汇编代码,这对我来说不太容易阅读。

有没有工具可以将翻译后的MSIL显示为C#代码或伪代码?

非常感谢提供相关链接。

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

不清楚您想要什么 - Reflector/ILSpy可以将IL反编译为C#,但不确定它如何帮助理解IL本身。 - Alexei Levenkov
反射器向我展示了我编写的没有任何优化的相同代码。我写道:using (TextWriter w = File.CreateText("log.txt")) { w.WriteLine("This is line one"); 这正是他向我展示的内容。 - Jviaches
下面提到的很多工具实际上会隐藏优化的事实。它们知道如何识别特定的优化并将反编译的C#恢复为原始形式。如果你真的想学习C#编译器如何优化IL,请学习IL。这并不难。只需逐个查找每个指令并在几个小时内就能获得足够的理解能力以便阅读它。你还可以进一步查看x86汇编代码。 - Dennis
4个回答

2

1

0

0

ILSpy(http://ilspy.net/)是一个好用且免费的工具,如果你想的话还可以查看源代码。 Reflector也很不错,但现在已经不再免费了(而且价格昂贵)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接