アセンブリ (共通言語基盤)

共通言語基盤においてアセンブリ () とはコンパイルされたコードライブラリのことであり、配置・バージョン管理・セキュリティ管理の単位となる。
概要.
Windowsの.NET Frameworkの実装においては、アセンブリはPE形式ファイルである。アセンブリにはプロセスアセンブリ (EXE) とライブラリアセンブリ (DLL) の二種類がある。CLR 1.1においてはクラスの外部への公開はライブラリアセンブリでのみ可能だったが、CLR 2.0ではこの制限は緩和された。.NETはアセンブリがプロセスかライブラリかを判断するのに拡張子ではなく内部に設定されたフラグを用いる。従って、ライブラリアセンブリがcodice_1の拡張子をもつことも可能である。
アセンブリに格納されるコードはコンパイルされてCILの形をとっており、実行時には仮想実行システム (VES) によって実行される。
アセンブリは、1つ以上のファイルからなり、アセンブリ自身を表すマニフェストや実行コード、リソースなどが含まれる。コードファイルはモジュールと呼ばれ、アセンブリは1つ以上のモジュールを含む。モジュールの作成にはさまざまな言語が使用でき、1つのアセンブリを作成するのに複数のプログラミング言語を使用することも技術的に可能である。ただし、Visual Studioは1つのモジュールを含むアセンブリしか作成できず、これは稀である。
アセンブリ名.
アセンブリ名は4つの部分からなる。
公開キートークンはアセンブリ名の重複を防ぐために使われる。従って、2つのアセンブリが同じファイル名であった場合でも.NETは両者を区別することができる。しかし、Windowsのファイルシステムはファイル名しか認識できないため、同じ短縮名をもつアセンブリを同じフォルダに置くことはできない。これを解決するために、.NETはGAC (グローバル アセンブリ キャッシュ) という仕組みを用意している。これによって、複数のフォルダに置いたアセンブリをCLRにとっては同じフォルダにあるものとして認識することができる。
アセンブリの偽装攻撃を防ぐために、アセンブリは秘密キーで署名される。アセンブリに署名する際、アセンブリの重要な部分のハッシュをとりそれを秘密キーで暗号化する。このハッシュは公開キーとともにアセンブリ内に格納される。CLRが厳密名で指定されたアセンブリをロードする際、暗号化されたハッシュを公開キーで復号し、それをアセンブリのハッシュと比較する。それらが一致した場合、アセンブリに格納された公開キーは署名に使われた秘密キーに対応するものだということになる。
サテライトアセンブリ.
一般に、アセンブリはニュートラルカルチャのリソースのみを含んでいるべきである。アセンブリをローカライズしたい場合（例えばロケールによって異なった文字列を参照したい場合）、サテライトアセンブリを使う。サテライト () とは「衛星」あるいは「従者」の意味であり、サテライトアセンブリはリソースのみを含む特殊なアセンブリである。サテライトアセンブリはFusion（後述）によってロードされないので、コードを含めるべきではない。その名前が示すように、サテライトアセンブリはメインアセンブリと呼ばれるアセンブリに関連付けられる。各サテライトアセンブリは、メインアセンブリ名の末尾に「.resources」を付加した名前をもつ。例えば、メインアセンブリが「lib.dll」であれば、サテライトアセンブリは「lib.resources.dll」となる。サテライトアセンブリは非ニュートラルカルチャをもつが、Windowsのファイルシステムはこれを認識することはできないので、異なるカルチャをもつサテライトアセンブリを作成するとファイル名が重複してしまう。これを防ぐために、サテライトアセンブリはアプリケーションフォルダ下のカルチャ別のフォルダに格納される。例えば英国英語のカルチャをもつサテライトアセンブリが「lib.resources Version=0.0.0.0 Culture=en-GB PublicKeyToken=null」という名称だったとすると、ファイル「lib.resources.dll」は「en-GB」というサブフォルダに格納される。
サテライトアセンブリはcodice_3クラスによってロードされる。リソースを取り出すために、開発者はメインアセンブリの情報とリソースの名称を提供しなければならない。codice_4クラスは実行環境のロケールを読み取り、その情報とメインアセンブリ名からサテライトアセンブリ名とそれが格納されたサブフォルダ名を取得する。そしてそこからサテライトアセンブリをロードし、ローカライズされたリソースを取得する。
Fusion.
Windowsのファイルシステムはアセンブリのバージョンやカルチャの情報を認識することができない。つまり、同じ名前でバージョンだけが異なるアセンブリを1つのフォルダに格納することができない。
Fusionはバージョンやカルチャといった情報をファイルシステム上の名前として使用できるようにするための技術である。
Fusionはアセンブリを検索する際、決まった順序に沿って検索を行う。
もしこれでもアセンブリを見つけることができなかった場合、Fusionは例外を投げる。さらに、アセンブリ名やFusionが検索したパスなどの情報が保存される。この情報はFusionログビューワ (fuslogvw) で確認できる。