解説

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

第2回 アセンブリのアイデンティティ

吉松 史彰
2003/07/02 改訂(改訂前の記事はこちら

Page1 Page2 Page3 Page4 Page5

 本稿は、2002/05/16に公開された記事を、.NET Frameworkの新しいバージョンである「.NET Framework 1.1」に対応させ、全面的に加筆・修正を行った改訂版です。

はじめに

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

 今回より、CLRがアセンブリをロードして実行するまでを解説する。だがその前に、前回で解説しなかった、重要な点を解説しなければならない。それは、アセンブリの名前(アイデンティティ)についてである。

アセンブリの名前

 アセンブリをロードしたり、ほかのアセンブリを参照したりするためには、アセンブリを指定しなければならない。アセンブリは、前回書いたとおり論理的なもので、実体はない。だから、アセンブリの名前はファイル名ではないし、物理的な情報(配置場所など)は一切含まれていない。

 アセンブリの名前には、主に次の情報が含まれる。

  • 名前(簡易名)
  • バージョン
  • カルチャ
  • 公開キー

 名前の部分は、通常はコンパイラやアセンブリ・リンカが自動的に付ける。コンパイラはほとんどの場合、出力ファイル名に基づいてこの名前を決定する。

 バージョンの部分には、このアセンブリのバージョンを指定する。バージョンは、メジャー、マイナー、ビルド、リビジョンの各部に分かれている。この番号はファイルのバージョンとは関係なく、自分で自由に付けることができる。

 カルチャの部分には、このアセンブリが特定のカルチャ(言語などの情報)に特化したリソースを保持している場合に、それを指定する。“ja-JP”や“en-US”などが指定できる。この情報は、実行コードが入っているアセンブリには指定しない。カルチャに特定の情報が指定されている場合、そのアセンブリはサテライト・アセンブリと呼ばれ、特定のカルチャに特化したリソースだけが含まれるアセンブリとなる。

 公開キーの部分には、このアセンブリに署名をしたときに使用した秘密キーと対になっている公開キーの情報が入る。公開キーの部分が存在する名前のことを、厳密名(Strong Name)と呼んでいる。

アセンブリの命名

 アセンブリに名前をつけるのは開発者の役目だ。開発者は、アセンブリの名前のうち簡易名を除く3つの部分については次のように指定することができる。

■ソース・コードに名前を埋め込む

 ソース・コードに、アセンブリ・レベルの属性として次のように指定する。

[assembly: System.Reflection.AssemblyVersion("1.0.0.0")]
[assembly: System.Reflection.AssemblyCulture("")]
[assembly: System.Reflection.AssemblyKeyName("CspContainer")]
C#/JScript .NET
 
<assembly: System.Reflection.AssemblyVersion("1.0.0.0")>
<assembly: System.Reflection.AssemblyCulture("")>
<assembly: System.Reflection.AssemblyKeyName("CspContainer")>
Visual Basic .NET
 
[assembly: System::Reflection::AssemblyVersion("1.0.0.0")];
[assembly: System::Reflection::AssemblyCulture("")];
[assembly: System::Reflection::AssemblyKeyName("CspContainer")];
C++ マネージ拡張

/** @assembly System.Reflection.AssemblyVersion("1.0.0.0")*/
/** @assembly System.Reflection.AssemblyCulture("")*/
/** @assembly System.Reflection.AssemblyKeyName("CspContainer")*/
J#

 名前で分かるとおり、上からバージョン、カルチャ、公開キー(が入っているCSPコンテナ)を指定している(CSPコンテナについては後述)。ソース・コードに属性の名前をいきなり書いてしまうと、その属性がどのレベルに適用されるのかが分からなくなってしまうので、「assembly:」と指定してこれがアセンブリに対して適用される属性であることを示している。このようなスコープ制限としては、ほかに「module:」や「return:」などがある。

 「AssemblyKeyName属性」に指定しているものについての解説はこのあとで行う。

■アセンブリ・リンカ al.exeを利用する

 アセンブリ・リンカである“al.exe”を使ってアセンブリを作るときには、アセンブリの名前の4つの部分をコマンドライン・オプションで指定することができる。アセンブリの名前のうち、簡易名は「/outスイッチ」で指定したファイル名の拡張子を取り除いたものになる。そのほかの3つは次のとおりだ。

% al.exe /out:<名前>.dll /version:1.0.0.0 /keyname:CspContainer <モジュールファイル>


 INDEX
  解説 インサイド .NET Framework [改訂版]
  第2回 アセンブリのアイデンティティ
  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 記事ランキング

本日 月間