解説インサイド .NET Framework第1回 マネージ・コード/アセンブリ/モジュール吉松 史彰 2003/06/25 |
アセンブリとモジュールの作成
モジュールはコンパイラが作成するが、アセンブリは何が作成してくれるのだろうか。結論をいうと、ほとんどの場合はコンパイラが作成する。C#(csc.exe)とVB.NET(vbc.exe)のコンパイラでは、/targetオプション(/tと省略可)を使って、何を生成するのかを制御することができる。
/target: | アセンブリを生成するか | 単独で実行可能か |
module | No | No |
library | Yes | No |
exe | Yes | Yes |
winexe | Yes | Yes |
C#とVB.NETの/targetオプションでの指定 |
一方、上記C#コンパイラのオプションは、VC++ .NETのコンパイラ(cl.exe)では次のようになる。
C#(csc.exe) | VC++ .NET(cl.exe) |
/t:module | /clr:noAssembly file.cpp /LD |
/t:library | /clr file.cpp /LD |
/t:exe | /clr file.cpp |
/t:winexe | /clr file.cpp /link /subsystem:windows |
C#コンパイラの/targetオプションとVC++ .NETコンパイラのオプションとの対応 |
このように、.NET Framework 1.1 SDKに標準で付属する5つのコンパイラは、どれもモジュールを作り出せると同時に、アセンブリも作り出すことができる。C#などの場合、targetオプションをmoduleに設定した場合だけ、モジュールのみが作成されることになる(ただしJScript .NETのコンパイラでは、moduleは指定できない)。
シングル・モジュール・アセンブリの作成
例えば、sourcecode.csファイルをコンパイルする。
% csc /t:library /out:mylib.dll sourcecode.cs
この結果、mylib.dllという名前のモジュールが生成される。mylib.dllには、次のようにメタデータとILコードが含まれる。
メタデータとILコードが含まれるモジュールmylib.dllの構造 |
この様子は、SDKに付属のildasm.exe ツールを使って確認することができる。メタデータに関する詳細情報を見るためには、次のように/advオプションを指定してildasm.exeを実行する。
% ildasm /adv mylib.dll
ildasm.exeツールの実行例 |
モジュールに含まれるメタデータやILのコードを見ることができる。画面は.NET Frameworkに含まれるクラス・ライブラリのモジュール(mscorlib.dll)をildasm.exeで開いたところ。 |
cscの/t:libraryオプションは、アセンブリも生成する。この場合は、mylib.dllが1つだけ含まれる、「シングル・モジュール・アセンブリ」になる。シングル・モジュール・アセンブリでは、その単一のモジュールの中に、アセンブリに関する情報も含まれている。アセンブリに関する情報とは、アセンブリの名前、アセンブリが外部に公開している型、アセンブリの署名を確認するための公開鍵などだ。これらの情報は、「マニフェスト(manifest)」と呼ばれる領域に書き込まれる(manifestは「積荷目録」の意)。つまり、上記のコンパイルを行うと、実際には次のような構造のファイルができることになる。
シングル・モジュール・アセンブリであるmylib アセンブリの実際の構造 |
つまりモジュールに加えて、さらにアセンブリに関する情報が含まれるわけだ。この場合、マニフェストには、アセンブリの名前に関する情報が含まれている。本来マニフェストには、そのアセンブリが参照する外部のアセンブリに関する情報や、そのアセンブリが外部に公開する型に関する情報が含まれるのだが、シングル・モジュール・アセンブリの場合、モジュールのメタデータにも同じ情報が書いてあるため、重複を省くために省略される。
INDEX | ||
解説 インサイド .NET Framework | ||
第1回 マネージ・コード/アセンブリ/モジュール | ||
1.はじめに | ||
2.プログラムが提供する詳細情報 | ||
3.アセンブリとモジュールの作成 | ||
4.マルチ・モジュール・アセンブリの作成 | ||
5.マルチ・モジュール・アセンブリの必要性 | ||
「解説:インサイド .NET Framework 」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|