解説

インサイド .NET Framework [改訂版]

第1回 マネージ・コード/アセンブリ/モジュール

吉松 史彰
2003/06/25
Page1 Page2 Page3 Page4 Page5

マルチ・モジュール・アセンブリの作成

 いま述べたシングル・モジュール・アセンブリに対し、複数のモジュールを1つのアセンブリとして構成したものは「マルチ・モジュール・アセンブリ」と呼ばれる。例えば、CやC++でコードを書いてコンパイルすると、objファイルが出来上がり、このobjファイルと、ほかのobjファイルやlibファイルをリンクすると、実行可能ファイル(exeやdll)が出来上がる。それと同様に、ソース・コードをコンパイルして、モジュールを作り、出来上がったモジュールを複数リンクしてアセンブリを作ることができるのだ。

 ただし残念ながら、現行のVisual Studio .NET(以下VS .NET)でC#やVB.NETのプロジェクトを利用する限り、マルチ・モジュール・アセンブリは作れない。VS .NETは、1つのプロジェクトをシングル・モジュール・アセンブリとして構成する。ほかのアセンブリを参照することはできるが、ほかのモジュールをアセンブリに取り込むことはできない。このためマルチ・モジュール・アセンブリを作るには、コマンドライン・コンパイラを使う必要がある。逆にいえば、VS .NETがなくても、SDK(.NET Framework SDK)だけで十分この作業ができることになる。

 マルチ・モジュール・アセンブリを作るには、まず上記のコンパイラ・オプションのうち、/t:moduleを使って、アセンブリではない、モジュールのみのファイルを生成する。この時点では、素材が出来ただけでアセンブリにはなっていない。モジュールをアセンブリにするには2つ方法がある。1つはコンパイラを使う方法、もう1つはアセンブリ・リンカ(al.exe)を使う方法である。

 コンパイラを使う方法は、複数のモジュールと、まだコンパイルされていないソース・コードがあるときに利用できる。vbc.exeとcsc.exeには、/addmoduleというオプションがある。例えば次のようにして、あらかじめコンパイルされたモジュールと、指定したソース・コードをコンパイルしたモジュールとをまとめて、1つのアセンブリにすることができる。

% csc /t:module /out:mylib.netmodule mylib.cs
% csc /t:library /addmodule:mylib.netmodule /out:mainmod.dll mainmod.cs

 VC++ .NET(cl.exe)の場合は、次のようになる。

% cl /clr:noAssembly mylib.cpp /LD /o mylib.netmodule
% cl /clr mainmod.cpp /link /dll
    /assemblymodule:mylib.netmodule /out:mainmod.dll

 この結果、次のようなアセンブリが作成される。

コンパイラにより作成したマルチ・モジュール・アセンブリの構造

 従来のobjファイルやlibファイルをリンクして作る実行可能ファイルとは違い、アセンブリには複数の物理的なファイルが含まれる。従って上記のコマンドを実行しても、mainmod.dllにmylib.netmoduleの中身が取り込まれるわけではない。あくまでも独立した物理ファイルとして存在しつつ、アセンブリとしては論理的にひとかたまりのコードとして存在するということになるのだ。前述したとおり、モジュールは物理的な存在であり、アセンブリは論理的存在なのである。

 すでにすべてがコンパイルされて、モジュールになっているファイルをまとめてリンクし、アセンブリを作ることもできる。それには、アセンブリ・リンカ(al.exe)を使う。

 アセンブリ・リンカにはいろいろな機能があるが、マルチ・モジュール・アセンブリを作るには、次のように複数のモジュール・ファイルを入力として指定し、出力ファイル名を指定すればよいだけだ。

% csc /t:module /out:mylib.netmodule mylib.cs
% csc /t:module /out:mainmod.netmodule mainmod.cs
% al /t:library /out:application.dll mainmod.netmodule mylib.netmodule

 この結果、次のようなマルチ・モジュール・アセンブリが作成される。

アセンブリ・リンカにより作成したマルチ・モジュール・アセンブリの構造

 やはりモジュールはファイルとしてそのまま残り、出力ファイル名として指定された名前の、マニフェストだけが含まれるファイルがプラスされて、3つのファイルで1つのアセンブリが構成される。

マニフェストに含まれるもの

 マルチ・モジュール・アセンブリを眺めると、マニフェストには何が書かれている必要があるのかが見えてくるだろう。シングル・モジュールのときとは違い、マルチ・モジュール・アセンブリのマニフェストには、

  • アセンブリの名前(アイデンティティ)
  • アセンブリに含まれる各モジュールが参照している外部のアセンブリの情報
  • アセンブリに含まれる各モジュールが外部に公開している型の情報
  • アセンブリを構成しているファイル(モジュール)の情報

が含まれている。まさにマニフェスト(目録)の役割を担っているわけだ。

 例えば、マルチ・モジュール・アセンブリの最初の例では、mainmod.dllのメタデータに書いてある情報はマニフェストからは省略される。だが、2つ目の例では、マニフェストの中に2つのモジュールに関する上記の内容がすべて収められている。


 INDEX
  解説 インサイド .NET Framework [改訂版]
  第1回 マネージ・コード/アセンブリ/モジュール
    1.はじめに
    2.プログラムが提供する詳細情報
    3.アセンブリとモジュールの作成
  4.マルチ・モジュール・アセンブリの作成
    5.マルチ・モジュール・アセンブリの必要性
 
インデックス・ページヘ  「解説:インサイド .NET Framework [改訂版]」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間