2

コンパイル時に静的に参照されるアセンブリを、実行時に使用する別のアセンブリと交換できるのは、どのような条件下ですか? 例えば:

アプリの組み立て:

  • 参照共通アセンブリ
  • ServiceProviderFactoryサービス アセンブリの参照

共通アセンブリ:

  • 定義するIServiceProvider

サービス アセンブリ:

  • ( s のServiceProviderFactoryファクトリ) を提供します。IServiceProvider
  • 参照共通アセンブリ

上記を考慮して、インストール時にサービス アセンブリを交換できるようにしたいと考えていますが、新しいサービス アセンブリがどのような条件下で引き続き読み込まれるかはわかりません。

私は、次のことが成り立たなければならないと考えています。

  1. 同じアセンブリ名、
  2. 弱い名前のアセンブリ、または厳密な名前のアセンブリ内の同じバージョン番号、および
  3. ServiceProviderFactory署名は一定のままです。

注:リフレクションを使用してサービスアセンブリを検索して、固定された署名が存在IServiceProviderするものに依存するよりも実装を検索する方が良いようServiceProviderFactoryですが、上記に対する回答にはまだ興味があります。

4

1 に答える 1

1

厳密な名前が付けられている場合、バージョンの違い以外にアセンブリのリダイレクトを実際に使用することはできません。ただし、AppDomain.AssemblyResolve イベントを使用して、要求されたアセンブリのバインドに失敗した場合にアセンブリを提供できます。

リリースされた MEF のビルドを参照する .NET 4 アプリケーションで MEF の CodePlex ビルドを参照する .NET 2.0 アセンブリをサポートしようとしたときに、概念実証として実際にこれを試しました。これは、誰かがその邪悪なトリックで回答した私の質問へのリンクです。

ただし、これはすべて非常にトリッキーであり、実際のアプリケーションでこれを行うのは気が進まないでしょう。インターフェイスを別のアセンブリに抽出し、MEF や Unity などのある種の依存性注入を使用して、それらのインターフェイスを実装する型を動的にロードできますか?

于 2010-12-10T06:54:39.403 に答える