厳密名を持つアセンブリとは何なのか調べてみた

アセンブリを参照設定する際に「厳密名」というキーワードが出てきます。「厳密名」とは何か、参照設定での違いはあるのか、実行時にどのように動くのか調べてみました。

  • 厳密名とは


厳密名とは、以下の4つの属性を使ってアセンブリを一意に識別する名称です。

  1. ファイル名(拡張子無し)
  2. バージョン番号
  3. カルチャID
  4. 公開キートーク


具体的には、プロジェクトファイルで良く見かける以下の様な値を指します。

FarPoint.Win, Version=3.0.2010.2005, Culture=neutral, PublicKeyToken=a5fa960294d899e7


アセンブリに厳密名を付けるには、アセンブリの発行者によって公開キーと秘密キーのペアによって署名される必要があります。署名は、アセンブリのプロジェクトプロパティの[署名]タブでアセンブリの署名にキーファイルを指定することで行います。


署名していないアセンブリには厳密名がありません。厳密名の無いアセンブリは具体的は参照設定すると以下の様な公開キートークンが無い値になります。厳密名が無い=公開キートークンが無いとも言えます。

WeakAssembley, Version=1.0.0.0, Culture=neutral


補足ですが、ここで言う署名は単なる発行者による自己署名でHTTPS(SSL)に使われる存在証明とは異なります。この署名はアセンブリの改ざん防止のためのものです。発行者の存在証明としてはオレオレ証明にしかなりません。発行者の存在証明にはAUTHENTICODEテクノロジという別の技術を使います。

  • 厳密名の有無による参照設定の違いは?


厳密名を持つアセンブリは実行時にアセンブリをロードする際に厳密名を構成する3つのキー(ファイル名・バージョン・公開キートークン)が一致するか検証を行います。(検証の結果、カルチャはロードには関係ない事が分かりました)1つでも異なる場合は実行されません。


厳密名を持たないアセンブリは、ファイル名(拡張子無し)のみでアセンブリをロードします。(バージョン及びカルチャは無視されます。)

  • 厳密名無しの場合にバージョン及びカルチャを無視するって本当?


本当です。バージョンを2.2.2.2、カルチャをアイルランド語に変更した同じファイル名を持つアセンブリを作って、入れ替えても動作しました。

  • 厳密名有りの場合に厳密名を構成する3つのキー(ファイル名・バージョン・公開キートークン)を変更した場合は?


全パターンで試してみると以下の様になりました。カルチャは、アセンブリのロードには関係ないようです、サテライトアセンブリなどリソースの読み込みだけのようです。

  1. バージョン番号が違う→アセンブリをロードできない。
  2. 公開キートークンが違う→アセンブリをロードできない。
  3. カルチャが違う→ロードできる。
  • 参照設定したアセンブリが厳密名をもっているか持っていないかは何処で確認できる?


参照設定したアセンブリのプロパティページの[厳密な名前]がTrueな場合は厳密名を持っているアセンブリ、Falseの場合は厳密名が無いアセンブリです。



厳密名があるアセンブリの場合。[厳密な名前]がTrue。(ローカルコピーの欄ではないので注意!)



厳密名が無いアセンブリの場合。[厳密な名前]がFalse。(ローカルコピーの欄ではないので注意!)