4

私は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#コードまたは擬似コードを確認することです。

4

4 に答える 4

2

TelerikJustDecompileをお勧めします。「永遠に無料」になります。

歴史的に長い間、LutzRoederによる「TheReflector」がありました。しかし、それは現在RedGateが所有しています。あなたはまだそれを高額で手に入れることができます。

于 2013-01-11T19:33:41.793 に答える
1

ReflectorILSpydotPeek、および ildasm。

Reflexilは、Reflector 用の非常に優れたプラグインです。でも書いた通り今はリフレクターは有料です。

最適化について:

最適化するものはありますか?プロジェクトのプロパティで「コードの最適化」にチェックを入れましたか?また、JIT コンパイラはコンパイルの最適化を行います。SOS 拡張機能を使用して、メソッドのマシン コードを取得できます。

JIT 出力の取得

とにかく、JIT がコンパイルしたものを確認するにはどうすればよいですか?

Visual Studio での SOS、SOSEX、ダンプによるデバッグ

于 2013-01-11T19:32:02.763 に答える
0

無料で信頼できる IlSpy をお勧めします

http://ilspy.net/

于 2013-01-11T19:28:02.083 に答える
0

ILSpy (http://ilspy.net/) は優れた無料のツールで、必要に応じてソース コードも確認できます。Reflector は優れていますが、無料ではありません (avec は高価です)。

于 2013-01-11T19:30:31.507 に答える