私はMSILの仕事に関して非常に好奇心が強いです。私がコンパイル時に理解している限り、CLRは、後でJITによってマシンコードに変換されるいくつかの最適化を提供するために、そのコードをMSILに変換します。
たとえば、次の場合:
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コードに変換されていることがわかりました。
翻訳されたMSILをC#コードまたは擬似コードで表示するツールはありますか?
参考文献と関連リンクを高く評価します。
PS
私は上記のように使用して書いた:
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#コードまたは擬似コードを確認することです。