我很想了解MSIL的工作原理。据我了解,在编译时,CLR将其代码转换为MSIL,以提供一些优化,之后由JIT将其转换为机器码。例如,如果我们有:
从这段代码中可以看到 System.IDisposable.Dispose,它似乎是优化的一部分。我想要看到 C# 代码或伪代码。
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# 代码或伪代码。