我对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拥有.你仍然可以获得它
价格高昂.