是否有用于MSIL结果的工具?

本文关键字:工具 结果 MSIL 用于 是否 | 更新日期: 2023-09-27 17:51:19

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

是否有用于MSIL结果的工具?

我推荐Telerik JustDecompile。"永远免费"。

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

历史上很长一段时间都有卢茨的《反射者》罗德。但它现在归RedGate所有。你仍然可以得到它

  • http://www.reflector.net/

Reflector, ILSpy, dotPeek和ildasm。

Reflexil是一个非常好的Reflector插件。但正如我所写的那样,Reflector现在已经得到了报酬。

关于优化

:

是否存在需要优化的内容?您是否在项目属性中勾选了"优化代码"?JIT编译器也做了一些编译优化。您可以使用SOS扩展名获取方法的机器码:

检索JIT输出

我怎样才能看到JIT编译了什么?

在Visual Studio中调试SOS, SOSEX和Dumps

我推荐IlSpy,它免费且可靠

http://ilspy.net/

ILSpy (http://ilspy.net/)很好且免费,如果您愿意,也可以查看源代码。