web-dev-qa-db-ja.com

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

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

  1. このMSIL/CILはこれらのexe/dllファイルに含まれていますか?
  2. その中間言語コードを見たいです。その存在を感じるためだけに。表示方法は?
  3. 彼らはこのexe/dllファイルをAssemblyと呼んでいます。バイナリコード(ネイティブコード)を含むexe/dllファイルと区別するために、この「空想の言葉」を使用していますか?
118
walter
  1. はい、より正確には.textセクションの PEファイル (ポータブル実行可能ファイル= * .exeまたは* .dll)。詳細については、 こちら をご覧ください。
  2. 最良の選択は ILSpy を使用することです(Reflectorはもはや無料ではありません)。これは無料の逆アセンブラで、アセンブリをMSILに分解できますが、C#、VB(ある程度))。
  3. 基本的にははい。アセンブリは、MSILコードと対応するメタデータを含むファイルです。これはPEファイル自体に制限されませんが、現在のすべてのCLR実装はPEファイルを使用します。

そのことに関しても良い本をお勧めするなら、それはSerge LidinによるExpert .NET 2.0 IL Assemblerです。彼はMSILを設計した男です。

89

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

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

46
Mark Rushakoff

オンラインで使用する場合は、 。NET Fiddle が最適です。コードを貼り付けて[View ILオプションを右上に。

24
nawfal

別のオプション:UseReSharper

enter image description hereソース/ IL同期ビュー:左の青い背景線は右のILブロックに対応しています

Visual Studioの場合:

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

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

resharperヘルプの Viewing Intermediate Language(IL) を参照してください。上の写真はResharper Helpからのものです。

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

「ReSharperとdotPeekを使用した中間言語(IL)の探索」、Maarten Balliauw著、2017年1月19日- Jetbrains Blog

12
Michael Brux
  1. はい、アセンブリにあります。
  2. 。NET Reflector または ILDasm が必要です。
  3. アセンブリチェックの詳細 [〜#〜] here [〜#〜]

追伸あなたはいくつかの本をフォローしているので、強くお勧めします C#経由のCLR

12
Incognito

アセンブリは、マニフェストによって組み立てられたアセンブルされたモジュールのセットであるため、「アセンブリ」と呼ばれると思います。

multi-file Assembly
(ソース: Microsoft.com

詳細については、 アセンブリの内容 を参照してください。

11
John Saunders

Visual Studio内でILコードを直接表示できる最適なツールを検索するのに数時間費やしました。

私がこれまでに見つけた唯一の解決策は、Msiler https://visualstudiogallery.msdn.Microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

それは非常にうまくいきます!

それ以外の場合、2番目に最適なソリューションは、Visual Studioの統合なしで、JetBrains dotPeekです。これは正直言って非常に素晴らしいことです。

7
sebas

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

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

これは古い質問であり、上記のツールのいずれかを使用したいと思います。ただし、ピンチでは、少なくともバージョン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ライブラリの「 方法:アセンブリコンテンツの表示 」を参照してください。

5
Eric Burcham

Sharplabsharplab はオンラインツールであり、単純なユースケースに最適です。左側にコードを入力すると、ILが右側に表示されます。

2
Colin

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

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

2
Luke

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

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

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

はい。NETワールドの各アセンブリは、ReflectorまたはILDasmで表示できるILコード(マニフェストと共に)を保持しています。さらに、ReflectorはC#とVB最適化されたコードを表示できます。これは、だれでもアセンブリのソースコードを表示できることを意味し、商用製品で難読化ツールが使用される理由です。

2
xenn_33

別のオプションがあります。これは VS Code with this extension built with Roslynで行うことができます。これは 現在は.NET Coreに制限されています です。

0
Adam Caviness