C#コンパイラによって生成されたMSIL / CILを表示するにはどうすればよいですか?なぜアセンブリと呼ばれるのですか?


130

.NET C#プログラミングは初めてです。私はいくつかの本をフォローしています。バイナリコード(ネイティブコード)に直接コンパイルするのではなく、高レベルのコードは中間言語(MSIL別名CIL)に変換されます。しかし、コンパイルすると、exe / Dllファイルが表示されます。

  1. このMSIL / CILはこれらのexe / dllファイルに含まれていますか?
  2. その中間言語コードを見たい。その存在を感じるためだけに。それを表示するには?
  3. 彼らはこのexe / dllファイルをと呼んでいますassembly。バイナリコード(ネイティブコード)を含むexe / dllファイルと区別するためだけに、この「派手な言葉」を使用していますか?

回答:


95
  1. はい、より正確に.textは、PEファイルのセクションにあります(ポータブル実行可能ファイル= * .exeまたは* .dll)。詳細については、こちらをご覧ください
  2. 最良の選択は、ILSpyを使用することです(Reflectorは無料ではなくなりました)。これは、アセンブリをMSILに逆アセンブルできる無料の逆アセンブラですが、C#、VB(ある程度)も逆アセンブルできます。.NET Framework SDKには、公式のMSIL逆アセンブラーであるILDasmが含まれています。
  3. 基本的にはい。アセンブリは、MSILコードと対応するメタデータを含むファイルです。これはPEファイル自体に限定されていませんが、現在のすべてのCLR実装はそれらを使用しています。

私がその問題についても良い本を勧めるなら、それはSerge LidinによるExpert .NET 2.0 IL Assemblerです。彼はMSILを設計した人です。


待つ!.textセクションにありませんか?そうでない場合、何が.text含まれていますか?そして、whats up with the #I think セクションの名前はで始まり.ます。だから魂はそうではありません.strings

知りたいのですが、なぜILDasmが推奨されないのですか?(一部のバージョンの)Visual Studioにのみ含まれていますか?
シンジャイ

2
どちらにも場所がありますが、ほとんど(> 99.99%)のユーザーにとって、ILSpyは正しい選択です。ILコードをC#に逆コンパイルする機能は、アセンブリをすばやくナビゲートおよびリバースエンジニアリングするために非常に重要です。生のILを出力するものを実行している場合(たとえば、コンパイラを作成している、またはMono.Cecilを使用してアセンブリILをリライトしている場合)、ILDasmは、ILの生の構造、トークンテーブルなどを表示できるので便利です。 、IL以外の専門家のほとんどはそれらに混乱するので、ILSpyはおそらく必要なすべてのものです。
ヨハネスルドルフ

3
うわー、7年後の素早い対応!私はILをあまりいじったり、すべてのオプションを比較したりしていません(そのため、そもそも私が尋ねているのはそのためです)が、LINQPadにはこの逆コンパイル機能がないのですか?
シンジャ

私はそれをVS 2017にインストールしましたが、クリックしてILSPYのコードを表示しても何も起こりません。
Anirudha Gupta

46

C#のスニペットのILを確認する私のお気に入りの方法の1つは、無料のLINQPadツールを使用することです。コードを入力し、上部の「C#ステートメント」(または「C#プログラム」のどちらか適切な方)を選択した後、コード入力領域の下の「IL」ボタンをクリックすると、生成されたILが表示されます。

これにLINQPadを使用すると、Visual Studioをロードするか、コマンドラインからコンパイラーを実行してから、ILDASMをロードしてテキストエディターで.ilファイルを開くよりもはるかに便利です。


別の優れたツールは、Reflector用のSnippyアドイン
Thomas Levesque

良いですね!私は賛成票を投じましたが、カスタムクラスを含める必要がある場合は少し複雑になります。それでも、私はこれが本当に好きです!
Andrew Steitz

28

オンラインで入手したい場合は、.NET Fiddleが最適です。コードを貼り付けてView IL、右上のオプションをクリックするだけです。


2
今壊れているようです。
ルークモーラー

@nawfalもここで壊れました。昔使っていました。
aloisdgが

ただし、別のオンラインソリューション、sharplab.ioがあります。詳細については、この回答を確認してください:stackoverflow.com/a/51457583/1248177
aloisdgがcodidact.comに移動

何が問題なのかわからない、私にとっては問題なく動作します。@ aloisdgmovingtocodidact.com。それは、sharplab.ioが滑らかに見えることを言った、と指摘してくれてありがとう:)
nawfal

16

別のオプション:ReSharperを使用する

ここに画像の説明を入力してください ソース/ IL同期ビュー:左の青い背景線が右のILブロックに対応

Visual Studioの場合:

  • ReSharperを選択する| ウィンドウ| ILビューア
  • またはコンテキストメニュー:ナビゲート| ILコード

ソースコードとILの同期ビューをサポート-ソース内のステートメントをクリックすると、IL内の対応するブロックが強調表示されます(逆も同様)。Microsoft Developer NetworkのILおよびECMA標準仕様の「Common Intermediate Language(CIL)命令セット」の説明を表示します。

Resharperヘルプの「中間言語(IL)の表示」を参照してください。上の画像は、Resharper Helpによるものです。

無料オプションはJetbrains dotPeekを使用することです

参照:「ReSharperとdotPeekを使用した中間言語(IL)の探索」、Maarten Balliauw、2017年1月19日-Jetbrains ブログ


誤って回答に反対票を入れました。
賛成投票

ReSharperのILビューアは素晴らしいです。IL構文の上にマウスを置くと、各キーワードの機能を説明するかなりわかりやすいツールチップが表示されます。ILを初めて使う人に最適です。
InvalidBrainException



9

シャープラブ sharplabはオンラインツールであり、簡単な使用例に最適です。左側にコードを入力すると、ILが右側に表示されます。


これまでで最高のツール+1
Emad

7

多くの点で、.NETアセンブリはJavaバイトコードパッケージに似ています。

  1. はい。マニフェストやその他のデータも含まれていますが、CILはexe / dllの一部です。
  2. ILDasmまたはReflectorを使用します。はるかに強力であるため、ほとんどの人はReflectorと言います。どちらもCILが作成された内容を示します。ウィキペディアには、より良い感じのために、すべてのCIL命令のリストがあります(アセンブリのようなものです)。
  3. 私はそれがコードのアセンブリとして意図されていると思います。それをネイティブと区別する良い方法です。


5

これは古い質問であることは承知しており、上記のいずれのツールもお勧めします。ただし、ピンチでは、少なくともバージョン2005以降、Visual Studioのボックス内にMSILビューアがありました。

ツールはという名前でildasm.exe、デフォルトのVisual Studioのインストール後、次のフォルダーにあります。

Visual Studio 2005」C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 " C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

詳細については、MSDNライブラリの「方法:アセンブリの内容を表示する」を参照してください。


2

私の経験から、IL関連の知識の最良の情報源は、Andrew Troelsenの「Pro C#and .NET Platform」です。第3版から始めて、彼はILを理解し、独自のコードを記述してILAsmを使用する方法について、本当に非常に優れた章(約50ページ)を持っています。この情報を使用して、.NETの世界に多重継承が存在するかどうかを調査しました。また、ILでいくつかの非常に興味深い機能(たとえば、VBにのみ存在し、C#には存在しない例外のフィルタリング)を採用することもできます。

その章を読むことを強くお勧めします。

結局、.NET Reflectorは、アセンブリのILコードを調査するためのエンタープライズ標準であり、Richterの本は間違いなく「必読」のものです。しかし、上記のような他の本から、あなたは本当に役立つものを明らかにすることができました:)

はい。.NETの世界の各アセンブリは、リフレクターまたはILDasmを介して表示できるいくつかのILコード(マニフェストと共にサイト)を保持しています。さらに、ReflectorはC#およびVB最適化コードを表示できます。これは、誰でもアセンブリのソースコードを表示できることを意味します。そのため、市販の製品では難読化ツールが使用されています。


2

中間言語を表示したいので、TelerikからJustDecompileをダウンロードしてみてください(現在は無料ですが、サインアップが必要です)。

DLLをドラッグしてIL、上部のドロップダウンボックスから選択します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.