10

私は C# 3.0 で CLR を読んでいて、アセンブリ、モジュール、およびヘッダーについて考えてきましたが、事態は複雑になりました。これは私が理解したことですが、誰かが物事をもう少し明確にすることができれば素晴らしいでしょう:

  1. モジュールは、IL コードとメタデータ テーブルを含む csc.exe の結果です。メタデータ テーブルには、次の 3 つの異なるテーブルが含まれています。

    • 「ModuleDef、TypeDef、PropertyDef、MethodDef、EventDef、FieldDef」などの定義テーブル
    • 「TypeRef、ModuleRef、MemberRef など」などの参照テーブル。
    • マニフェスト テーブル**
  2. アセンブリは、多くのモジュールと、画像、ドキュメント、pdf などのリソースを含むコンテナーです。

  3. Portable Executableを表すPEファイルは、.EXEまたは.DLLのファイルです。これらのファイルには、PE32 または PE32+ ヘッダー、CLR ヘッダー、メタデータ、IL コードが含まれます。

本には、アセンブリはモジュールで構成されるコンテナーであり、管理対象モジュールは管理対象モジュールであるとも書かれています

管理対象モジュール:

マネージ モジュールは、標準の 32 ビット Microsoft Windows ポータブル実行可能 (PE32) ファイルまたは標準 64 ビット Windows ポータブル実行可能 (PE32+) ファイルであり、実行には CLR が必要です。

リヒター、ジェフリー (2010-02-05)。C# 経由の CLR (Kindle Locations 696-697)。OReilly Media - A. Kindle 版。

アセンブリの定義:

アセンブリは、1 つ以上のモジュールまたはリソース ファイルの論理グループです。

リヒター、ジェフリー (2010-02-05)。C# 経由の CLR (Kindle Locations 766-767)。OReilly Media - A. Kindle 版。

ここに画像の説明を入力

そのため、マネージ モジュールは実際には、同じ本から取得した画像のアセンブリの一部であるように見えます。

PE32 ヘッダーはアセンブリに属しますが、著者はそれがマネージ モジュールにも属していると述べています。

ここでの分離は何ですか?モジュールとアセンブリが十分に分離しているように見えるにもかかわらず、なぜ彼は交換可能なモジュールとアセンブリを使用したのでしょうか。

マネージド PE ファイルには、PE32(+) ヘッダー、CLR ヘッダー、メタデータ、および IL の 4 つの主要部分があります。PE32(+) ヘッダーは、Windows が期待する標準情報です。CLR ヘッダーは、CLR を必要とするモジュール (マネージ モジュール) に固有の小さな情報のブロックです。

リヒター、ジェフリー (2010-02-05)。C# 経由の CLR (Kindle Locations 1628-1629)。OReilly Media - A. Kindle 版。

また、この画像は、モジュールには PE32(+) や CLR ヘッダーなどではなく、メタデータのみがあることを明確に示しています。マニフェストとメタデータは同じ意味で使用できると思いますか?

また、モジュール内の**マニフェスト テーブルについても説明していただけますか?

4

2 に答える 2

8

Richter の本は素晴らしいですが、「真実」はECMA CLI 標準で定義されています。
公定規格による定義については、第5章「用語と定義」をご確認ください。
そこにある定義を見るだけで、さまざまな用語の共通点と相違点を最もよく理解できると思います。

于 2012-04-08T18:25:57.037 に答える
5

あなたが投稿したものは、管理されたアセンブリが PE32 ファイルにどのように埋め込まれているかについて少し恥ずかしがり屋です。これは非常に柔軟な形式で、本来はネイティブの実行可能コードとリソースを格納することを目的としていましたが、データも格納できるほど柔軟です。これは、Windows の観点から見た実際のアセンブリです。そのデータを実行可能なものに変換できるのは CLR だけです。

PE32 ファイルには、アセンブリ以外のものが含まれています。実際にはネイティブコードも含まれています。純粋なマネージ アセンブリの場合は 5 バイト。マネージド コードのブートストラップである mscoree.dll へのジャンプ命令があります。EXE には _CorExeMain へのジャンプが含まれ、DLL には _CorDllMain へのジャンプが含まれます。これは混合モード アセンブリ用にさらに拡張され、System.Data.dll と PresentationCore.dll がその例です。それらには、マネージ クラスによってラップされたコードであるネイティブ コードの大きなチャンクが含まれています。C++/CLI コンパイラとリンカーは、そのようなアセンブリを作成する方法です。.text セクションにはコードが含まれ、.reloc セクションには、メモリ内の任意のアドレスに DLL をロードするのに役立つ再配置情報が含まれます。

ほとんどの PE32 ファイルには、管理されていないリソースも含まれています。Windows が認識する形式。これは .rsrc セクションに保存されます。たとえば、C# コンパイラはそこにリソースを自動的に作成しますが、これは /win32res オプションでオーバーライドできます。これは、[ファイル] + [開く] + [ファイル] で確認でき、アセンブリを選択できます。重要なものは次の 3 つです。

  • RT_MANIFEST には、リソース ID 1 のマニフェストが含まれています。これは、C# プログラムが UAC と互換性があることを Windows が理解するために必要なものです。プロジェクトにアプリケーション マニフェスト ファイルを追加して、独自のマニフェストを作成します。
  • ICON には、デスクトップ ショートカットのデフォルト アイコンとして選択された 1 つのアイコンが含まれます。
  • バージョンには、管理されていないバージョン リソースが含まれています。AssemblyInfo.cs のアセンブリ属性からコンパイラによって合成された Explorer Details プロパティ シートに表示されます。

Dumpbin.exe は、PE32 ファイルの内部を覗くツールです。残念ながら、マネージ アセンブリについて認識しているため、すべてを表示することはできません。

于 2012-04-08T18:56:07.793 に答える