web-dev-qa-db-ja.com

.NETアプリケーションがGACからアセンブリをロード/参照しないようにするにはどうすればよいですか?

アセンブリの代わりに「ローカル」アセンブリ( [〜#〜] gac [〜#〜] ではない)を参照する方法(Visual Studioの設定)で.NETアプリケーションを構成できますか? GAC内では、両方のアセンブリに同じ名前と同じバージョンがありますか?

35
Flo

両方のアセンブリに厳密な名前が付けられている(署名されている)場合、CLRは常にGACから読み込まれます。

ランタイムがアセンブリ参照を解決するためにランタイムが使用する手順は次のとおりです( ランタイムがアセンブリを見つける方法 から):

  1. アプリケーション構成ファイル、パブリッシャーポリシーファイル、マシン構成ファイルなど、該当する構成ファイルを調べて、正しいアセンブリバージョンを決定します。構成ファイルがリモートマシンにある場合、ランタイムは最初にアプリケーション構成ファイルを見つけてダウンロードする必要があります。

  2. 以前にアセンブリ名がバインドされているかどうかを確認し、バインドされている場合は、以前にロードされたアセンブリを使用します。アセンブリをロードする前の要求が失敗した場合、その要求はアセンブリをロードしようとせずにすぐに失敗します。

  3. グローバルアセンブリキャッシュをチェックします。アセンブリがそこにある場合、ランタイムはこのアセンブリを使用します。

  4. アセンブリ用プローブ(...一部の材料は省略...)

同じ記事の後半で述べているように:

厳密な名前のないアセンブリのバージョンチェックはありません。また、厳密な名前のないアセンブリのグローバルアセンブリキャッシュのランタイムチェックもありません。

したがって、ローカルアセンブリから署名を削除する余裕がある場合、アプリケーションはGAC内の署名の代わりにそれを使用します。

ランタイムバインディングメカニズムについておそらく想像する以上の詳細については、 Suzanne Cookのブログ を参照してください。

Scott Hanselmanからのこのブログエントリ は、バインディングプロセスの優れた概要も提供します。

24
Jeff Sternal

ilmerge を使用し、アセンブリを単一のライブラリにマージして回避できます。

1
Kelly Elton

ローカルdllのバージョン番号を変更できる場合は、oldVersion属性を使用してdllバージョンリダイレクトを使用できます。ローカルアセンブリには厳密な名前を使用できます。次のページをご覧ください。 http://msdn.Microsoft.com/en-us/library/7wd6ex19.aspx

また、ここで説明するように、コンパイルされたアセンブリのバージョン番号を変更できることを考慮する必要があります。 コンパイルされた.NETアセンブリのアセンブリバージョンを変更する

1
Paco Zarate