configを使用してプライベートフォルダの複数のアセンブリバージョンを操作するにはどうすればよいですか?
-
10-07-2019 - |
質問
アプリケーションのプライベートフォルダに次のような構造で保存する必要がある同じアセンブリの複数のバージョンがあるシナリオがあります:
.\My.dll // latest version, say 1.1.3.0
.\v1.1.1\My.dll // version 1.1.1.0
.\v1.1.2\My.dll // version 1.1.2.0
私の問題は、.Netランタイムが古いバージョンの1つを要求された場合、常に最新バージョンを見つけてから、ビルド番号の不一致により失敗してから、より良い一致を探そうとすることです。
アセンブリには厳密な名前が付けられており、app.configでこの構成を使用しています:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="My"
publicKeyToken="xxxxxxxx" culture="netural" />
<bindingRedirect oldVersion="1.0.0.0-1.1.1.0"
newVersion="1.1.1.0" />
<bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535"
newVersion="1.1.3.0" />
<codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
<codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
ここで見逃していることがあります。これは、 AppDomainをリッスンすることでコードで解決できることを知っています。 AssemblyResolve イベントですが、純粋な構成ソリューションが見たいです。
更新:それで、私はバグを見つけました。 culture =&quot; netural&quot;
は culture =&quot;ニュートラル&quot;
である必要があります。
とは言っても、タイプミスがなければ、各バージョンを指す codeBase
要素を使用すると解決がうまくいきます。
このシナリオでは、プローブ要素は機能しないようです。
解決
ソリューション全体を見ることなく、どこかにタイプミスがあると思います。私は自分でこれを試しました- fuslogvwの助けを借りて、動作させることができました。
アセンブリには3つのバージョンがあり、消費アプリケーションは出力ディレクトリにあるバージョンよりも古いバージョンを参照しています。 CLRはリダイレクトとcodeBaseエントリを見つけ、正しい(古い)バージョンをロードします。
メールアドレスを提供していただければ、ソリューションをメールで送信できます。
ケント
他のヒント
プローブパスを使用できますか?これを使用して、制御されていない(MSTestなどのサードパーティリゾルバ)必要なアセンブリを強制的に検索します。
<?xml version ="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="v1.1.1;v1.1.2;"/>
</assemblyBinding>
</runtime>
</configuration>
詳細については、こちらを参照してください