解説インサイド .NET Framework第7回 アセンブリとバージョン管理(後編) インフォテリア株式会社 |
バージョン・ポリシーの適用順
前回で解説したように、アプリケーションが参照するアセンブリをリダイレクトするためのバージョン・ポリシーは、複数の場所で記述することができる。このため、あるアセンブリに関するバージョン・ポリシーが複数存在することも考えられる。そのとき、ポリシーは次のように適用される。
メタデータを参照してアセンブリの初期バージョンが決定すると、CLRはまずアプリケーションの構成ファイルを探す。アプリケーションの構成ファイルにバージョン・リダイレクトの情報が書いてある場合、その情報が適用されて、新しいバージョンが検索対象となる。
次に、CLRは発行者ポリシーを探す。このとき対象となっているバージョンは、メタデータに書いてある元のバージョンではなく、すでにアプリケーション構成ファイルによってリダイレクトされた新しいバージョンである。発行者ポリシーでその新しいバージョンをさらに別のバージョンにリダイレクトするポリシーが見付かった場合、それが適用される。
最後に、CLRはマシン・ポリシーを探す。このときの対象バージョンはやはり発行者ポリシーによってリダイレクト済みの最新のバージョンである。その最新のバージョンをさらに別のバージョンにリダイレクトするポリシーがあれば、それが適用される。
以上、3つの流れを図に示すと次のようになる。
バージョン・ポリシーの適用順序 |
3種類のバージョン・ポリシーはこの図に示した順で検索され、適用される。 |
このように、マシン・ポリシーに書いてあるバージョンが最終的にロードされるバージョンになる。ただし、これは必ずしも「マシン・ポリシーが最も優先される」という意味ではないことにも注意が必要だ。例えば、次の図のように、アプリケーションの構成ファイルでマシン・ポリシーに記述がないまったく別のバージョンにリダイレクトがかかった場合、マシン・ポリシーには設定が何もないので、適用はされない。
アプリケーション構成ファイルのポリシーのみが適用される場合 |
必ずしもマシン・ポリシーが最優先されるわけではない。例えば、マシン・ポリシーでの記述に該当するリダイレクトされたバージョンが存在しない場合、このポリシーは適用されない。 |
アプリケーションの構成ファイルとマシン・ポリシーに両方ともバージョン1.0.0.0のアセンブリに関するバージョン・ポリシーが設定されていた場合、適用されるのはアプリケーションの構成ファイルのポリシーである。
このようにして、最終的に決定したバージョン番号を使ってアセンブリの厳密名を決定し、第4〜5回に解説した手順でアセンブリの探索が行われるのである。
発行者ポリシーの拒否
ユーザーはこれまで何度も苦い思いをしている。あるアプリケーションをインストールした途端、別のアプリケーションが動作しなくなってしまうという悪夢だ。それも、一見何の関係もなさそうな、ブラウザとワープロの組み合わせだったりするからたちが悪い。.NET Frameworkにおけるアセンブリの場合も、発行者ポリシーによって強制的に新しいバージョンにリダイレクトされた結果、その新しいバージョンのアセンブリがほかのアプリケーションと相性が悪いなどということが起こるかもしれない。
そのためマイクロソフトは、.NET Frameworkに「セーフ・モード」を導入した。.NET Frameworkにおけるセーフ・モードとは、アプリケーションがコンパイルされ、デバッグされ、テストされたときの状態に戻るという機能だ。この機能は、要するに発行者ポリシーによるバージョン・リダイレクトを無効化することを意味する。
設定は簡単で、アプリケーションの構成ファイルの<dependentAssembly>要素に次のような要素を設定すればよい。
<publisherPolicy apply="no" />
これが書いてあると、バージョン・ポリシーの適用順は上記の手順から発行者ポリシーを除いたものになる。つまり、まずアプリケーションの構成ファイルが適用され、次にマシン・ポリシーが適用される。これによって、開発者(配布元)からのバグ付きのバージョンアップを拒否できるようになっている。つまり、開発者はアセンブリのバージョンに関する最終的な判断をユーザーに強制できないのだ。ユーザー(管理者)が常に最後の判断を行えるようになっている。
INDEX | ||
解説 インサイド .NET Framework | ||
第7回 アセンブリとバージョン管理(後編) | ||
1.バージョン・ポリシーの適用順 | ||
2..NET Framework Configuration管理ツール | ||
3.アプリケーションの修復 | ||
「解説:インサイド .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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|