私は第三者のライブラリを参照するプロジェクトを持っています。ライブラリの製造元は、定期的に新しいバージョンをリリースしています。私の最終的な目標は、実行時にどのバージョンを使用する必要があるかを実行時に選択できるようにすることです。実行時に強く署名されたアセンブリを交換します
現時点では、コンパイル時に使用されたバージョンよりも高いバージョンのアセンブリを実行時にロードしようとしています。プロジェクトをコンパイルし、第三者のライブラリを新しいバージョンに置き換え、アプリケーションを実行しようとします。これは私が問題になったことです。
は
を「位置アセンブリのマニフェスト定義はアセンブリ参照に一致しない」アセンブリが強く署名されているので、私は、このエラーが表示しsupprisedいませんでした:私はというエラーを取得します。私はこれを回避する方法を探しましたが、これまでのところ運がありません。
私はバインディングリダイレクトが私を助けてくれると思っていましたが、「新バージョン」の範囲を指定できないという欠点があります。どんな組み合わせでも動作し、古いバージョンでは古いバージョンで動作し、その逆もあります。
<bindingRedirect oldVersion="1.2.7.0" newVersion="1.2.8.0" />
http://msdn.microsoft.com/en-us/library/eftw1fys.aspx
私はまた、動的呼び出しを見てきましたが、その後、私は(私のコードは、広く第3回パーティのアセンブリで定義された型を使用しています)型の安全性を失います。 →参照を削除するのは困難です。
プロジェクト定義の参照で公開鍵を削除しても、それは役に立ちませんでした。コンパイル中に使用された他のアセンブリバージョンは失敗します。
<Reference Include="<assemblyname>">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Dependencies\<manufacturer>\1.2.7.0\<assemblyname>.dll</HintPath>
</Reference>
注: 、実行時にアセンブリをロードおよびアンロードするためのロジックが既に存在しています。 第三者のライブラリで利用できるインターフェイスがありません
Brrと一致します。これはDLL Hellを機能として要求しています。強力な命名とは関係がありませんが、[AssemblyVersion]の不一致のために例外が発生します。 bindingRedirectは実際には唯一の良い解決策です。互換性のあるアセンブリの[AssemblyFileVersion]だけをインクリメントするようにベンダーに納得させることができない限り、あなたは立ち往生していません。 [AssemblyVersion]をインクリメントすることは、「互換性がなく、試していない」ことを意味します。 –
@HansPassant AssemblyVersionが実際にインクリメントされ、マニフェストの不一致が発生します。マニフェストの不一致は強く署名されたアセンブリでのみ発生すると言うのは間違いありませんか?あるいは、この問題は署名されていないアセンブリにも当てはまりますか? [Assembly Versioning](http://msdn.microsoft.com/en-us/library/51ket42z.aspx) – Nickolas
いいえ、[AssemblyVersion]のみここで重要です。署名されていないアセンブリでも全く同じ方法で失敗します。 –