(制御できない理由で) GAC にある必要がある .NET アセンブリがあります。ただし、同じアセンブリは、同じアセンブリの古いバージョンの独自のコピーを持つ別のプログラムによって使用されます。GAC にあるものではなく、独自のコピーを使用する必要があります。この場合、適切なバージョン管理は、おそらくその価値よりも手間がかかります。理由については触れません。私の質問は:とにかく.NETに伝えることはありますか:このディレクトリでこのDLLを使用するだけです-GACまたは他の場所で見つけたものはすべて無視してください。
6 に答える
GAC アセンブリとローカル アセンブリのバージョン番号が異なることを確認してください (AssemblyInfo: [assembly: AssemblyVersion("1.0.0.*" )] )。次に、アプリの構成を使用してアセンブリ バインディングをリダイレクトします。
- http://msdn.microsoft.com/en-us/library/2fc472t2(VS.80).aspx
- http://msdn.microsoft.com/en-us/library/433ysdt1(VS.80).aspx.
あなたの場合、assemblyBinding 構成の「appliesTo」属性は必要ありません。次のようなものが必要です:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
それらが同じバージョン番号を持っている場合、答えはできません。GAC されたアセンブリと同じ完全なアセンブリ名 (名前、バージョン、キー) を持つアセンブリを読み込もうとすると、CLR は毎回 GAC されたアセンブリを選択します。
アセンブリを強制的にロードするように DEVPATH を設定できます。リンク テキストを参照してください。
これは開発での使用のみを目的としており、本番での使用を反映していないため、実際には推奨されていないため、質問には答えません。しかし、知っておくと良いので、とにかく共有すると思いました。
同様の問題がありました。ildasm
およびを使用してターゲット dll の publicKeyToken を変更しilasm
、新しい dll を生成しました。次に、プロジェクト参照で更新して、新しいdllを指すようにしました。私が行った手順はこちらです。
これは私にとってはうまくいきました。
Assembly.LoadFromFile() を試しましたか? これは手動で行うことですが、必要になる前にアセンブリをメモリにロードする必要があります。.NET は、それを探すのではなく、メモリ内の 1 つを使用します。
もう 1 つの方法は、ローカル アセンブリが署名されていない場合に、そのように区別することです。
ロブ