.NET アセンブリ ファイルの形式.NET assembly file format

.NET では、.NET プログラムの完全な記述と格納に使用するバイナリ ファイル形式として、アセンブリが定義されています。.NET defines a binary file format, assembly, that is used to fully describe and contain .NET programs. アセンブリは、プログラム自体と同様に従属ライブラリにも使用されます。Assemblies are used for the programs themselves as well as any dependent libraries. .NET プログラムは、適切な .NET 実装以外の成果物を必要とせずに、1 つ以上のアセンブリとして実行できます。A .NET program can be executed as one or more assemblies, with no other required artifacts, beyond the appropriate .NET implementation. ネイティブの依存関係 (オペレーティング システム API を含む) は別の考慮事項であり、.NET アセンブリの形式には存在しません。ただし、この形式を使用して記述されることがあります (たとえば WinRT)。Native dependencies, including operating system APIs, are a separate concern and are not contained within the .NET assembly format, although they are sometimes described with this format (for example, WinRT).

各 CLI コンポーネントには、そのコンポーネントに固有の宣言、実装、参照のためのメタデータが含まれます。Each CLI component carries the metadata for declarations, implementations, and references specific to that component. そのため、コンポーネント固有のメタデータはコンポーネント メタデータと呼ばれ、結果として得られるコンポーネントは自己記述と呼ばれます (ECMA 335 I.9.1 のコンポーネントおよびアセンブリの仕様)。Therefore, the component-specific metadata is referred to as component metadata, and the resulting component is said to be self-describing – from ECMA 335 I.9.1, Components and assemblies.

この形式は ECMA 335 として仕様が完全に指定され、標準化されています。The format is fully specified and standardized as ECMA 335. すべての .NET コンパイラとランタイムが、この形式を使用します。All .NET compilers and runtimes use this format. ドキュメント化された、更新が頻繁でないバイナリ形式の存在は、相互運用性の面で大きなメリットであり、ほぼ間違いなく必要条件になっています。The presence of a documented and infrequently updated binary format has been a major benefit (arguably a requirement) for interoperability. この形式が最後に実質的な方法で更新されたのは 2005 年 (.NET 2.0) で、ジェネリックやプロセッサ アーキテクチャに対応するための変更が行われました。The format was last updated in a substantive way in 2005 (.NET 2.0) to accommodate generics and processor architecture.

この形式は CPU や OS に依存しません。The format is CPU- and OS-agnostic. 多くのチップや CPU を対象にした .NET 実装の一部として使用されています。It has been used as part of .NET implementations that target many chips and CPUs. この形式自体は Windows で開発された経緯がありますが、任意のオペレーティング システムに実装できます。While the format itself has Windows heritage, it is implementable on any operating system. OS の相互運用性にかかわる、この形式の最も重要なオプションと言えるのは、ほとんどの値をリトル エンディアン形式で格納することです。Its arguably most significant choice for OS interoperability is that most values are stored in little-endian format. コンピューターのポインター サイズ (32 ビット、64 ビットなど) に対する特定の関係はありません。It doesn’t have a specific affinity to machine pointer size (for example, 32-bit, 64-bit).

.NET アセンブリ形式は、特定のプログラムまたはライブラリの構造をとてもわかりやすく記述することもできます。The .NET assembly format is also very descriptive about the structure of a given program or library. アセンブリの内部コンポーネント、具体的にはアセンブリ参照や定義済みの型とそれらの内部構造を記述します。It describes the internal components of an assembly, specifically assembly references and types defined and their internal structure. ツールまたは API で表示のためにこの情報の読み取り、処理を行ったり、プログラムによる決定を行うことができます。Tools or APIs can read and process this information for display or to make programmatic decisions.


.NET バイナリ形式は、Windows PE ファイル形式に基づいています。The .NET binary format is based on the Windows PE file format. 実際には、.NET クラス ライブラリは Windows PE に準拠し、Windows ダイナミック リンク ライブラリ (DLL) またはアプリケーション実行可能ファイル (EXE) のように見えます。In fact, .NET class libraries are conformant Windows PEs, and appear on first glance to be Windows dynamic link libraries (DLLs) or application executables (EXEs). これは Windows 上でとても便利な特性であり、ネイティブな実行可能バイナリのように偽装して、実行可能バイナリと同じように扱うことができます (OS ロード、PE ツールなど)。This is a very useful characteristic on Windows, where they can masquerade as native executable binaries and get some of the same treatment (for example, OS load, PE tools).

アセンブリ ヘッダー

ECMA 335 II.25.1 のランタイム ファイル形式の構造に基づくアセンブリ ヘッダー。Assembly Headers from ECMA 335 II.25.1, Structure of the runtime file format.

アセンブリの処理Process the assemblies

アセンブリを処理するツールや API を記述することができます。It is possible to write tools or APIs to process assemblies. アセンブリ情報を使用して、実行時のプログラムによる決定、アセンブリの書き換え、エディターでの API IntelliSense の提供、ドキュメントの生成ができます。Assembly information enables making programmatic decisions at run time, re-writing assemblies, providing API IntelliSense in an editor and generating documentation. System.ReflectionSystem.Reflection.MetadataLoadContextMono.Cecil は、この目的によく使用されるツールの代表的な例です。System.Reflection, System.Reflection.MetadataLoadContext, and Mono.Cecil are good examples of tools that are frequently used for this purpose.