gac に同じ名前の別の古いバージョンのアセンブリがあるため、asp.net アプリケーションにローカルの bin ディレクトリからアセンブリを強制的にロードさせる方法はありますか?
他のアプリケーションが gac バージョンを使用しているため、gac バージョンを削除できず、新しいバージョンを gac に追加するときにいくつかの問題に直面しています。
バージョン番号を変更し、アセンブリに厳密な名前を付けて、ソリューションと共に展開する厳密な名前の上位バージョンを参照します。
提案されたソリューションの代替として、開発中に環境DEVPATH
変数を設定し、. これは、目的を達成するための最も簡単な方法だと思いますが、本番環境では使用しないでください。machine.config
これにより、アセンブリのバージョンと GAC 内のアセンブリのバージョンが同じであるという問題が解決されます。バージョンが異なる場合は、bindingRedirect
ここで複数のユーザーが言及したアプローチを使用する必要があります。
まず、以下を に追加しますmachine.config
。
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
次に、DEVPATH
環境変数を署名されていないアセンブリの場所に設定します。これにより、Fusion の DEVOVERRIDE モードが強制的に起動されDEVPATH
、GAC を調査する前に (およびそのサブディレクトリ) が検索されます。
MSDNの FAQ はDEVPATH
、DEVOVERRIDE
これを使用した場合の影響に関するほとんどの質問に答えます。
Fusion (.NET のアセンブリ ローダー) は名前とバージョンのみで検索し、厳密に名前が付けられたアセンブリを他のアセンブリと同等に扱い、検索する前に GAC を検索せず、DEVPATH
見つかった最初の一致を単に返します。このブログ投稿で説明されているように、Fusion Log Viewer (fuslogvw)を使用して、適切に有効化されていることを確認する必要があります。DEVPATH
FusLogVw を初めて使用しますか? Scott Hanselman は優れたイントロを書きました。Viewer のインターフェイスはかなり古風で、慣れるまで少し時間がかかります。
Fusion Log Viewer (または Assembly Binding Log Viewer、名前に含まれるもの) は、DEVOVERRIDE
環境変数を使用したと紛らわしく言うことに注意してください。次のようになります。
LOG: Found assembly in DEVOVERRIDE path D:\testassemblies\Test.DLL
DEVPATH
注: Visual Studio にその場所からアセンブリをロードさせたい場合は、レジストリ キーをこの場所に設定する必要があります。
[HKEY_CURRENT_USER\
SOFTWARE\
Microsoft\
.NETFramework\
v2.0.50727\AssemblyFoldersEx\
DEVPATH]@="C:\SharedAssemblies"
Muse VSExtensions で提案されている oldVersion 構成が機能します。ローカル アセンブリには厳密な名前を使用できます。次のページを参照してください: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
基本的に web.config に次のようなものを追加します。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DllName"
publicKeyToken="0123456789abc"
culture="neutral" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="2.0.0.0-2.5.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
そうすれば、gac にバージョン 2.0.0.0 からバージョン 2.5.0.0 までのアセンブリがある場合、すべての呼び出しは newVersion (3.0.0.0) にリダイレクトされます。
アセンブリ セクションで、アセンブリを追加しました。
<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />
以上です。
この回答のアセンブリの読み込み順序に関する抜粋されたメモに基づいて: How to prevent a .NET application from loading/referencing an assembly from the GAC?
ライブラリにアセンブリとしてロードするように要求する前に、ローカル DLL ファイルで LoadLibrary を呼び出すと、検索順序が上に移動する可能性があると推測しています。
残念ながら、フレームワークが参照アセンブリの読み込みを開始する前に LoadLibrary 呼び出しを実行する方法がわかりません。
したがって、これは単なるアイデアであり、完全な答えではありません。
あるバージョンを別のバージョンにリダイレクトするには、<bindingRedirect> 要素を使用します。oldVersion 属性は、単一のバージョンまたはバージョンの範囲を指定できます。たとえば、ランタイムが 1.1.0.0 から 1.2.0.0 までのアセンブリ バージョンではなく、バージョン 2.0.0.0 を使用する必要があることを指定します。
s
bindingRedirectを使用する代わりに、コードベースパスを指定できます。MySQL.Data.dll を使用した実例があります。
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<codebase version="5.2.5.0" href="/bin/MySQL.Data.dll" />
</dependentAssembly>
これは、Web アプリケーションの Web.config で行うことができます。
気に入ったバージョンをGACにインストールして、GACで参照してみませんか?