3

MEFを使用して拡張可能なアプリケーションを開発しています。アプリケーションには、さまざまな方法でデータを収集および処理するための多くの種類のプラグインがあります。

プラグインのバージョン管理されたオンラインリポジトリを構築することを考えています。これにより、ユーザーはプラグインが利用可能になったときに新しいバージョンをダウンロードできるようになります。

MEFが同じプラグインの異なるバージョンを同時にロードできるといいのですが、私が理解していることから、これは不可能です(間違っている場合は訂正してください)。

そのため、プラグインを更新して以前のバージョンをアーカイブする必要があるという事実に自分自身を辞任しました。

これを行うための最良の戦略は何でしょうか?

例1

アプリケーションは、ロードされた実行中のプラグインの新しいバージョンをダウンロードします。同じ名前のDLLがすでに存在するため、プラグインをプラグインディレクトリに配置できません。そのため、新しいプラグインの名前をバージョンサフィックスに変更できます。同じアセンブリをロードできないので、強制的に再起動する必要があると思います。したがって、再起動時に、古いプラグインを実現し、新しいプラグインをロードします。

---これは解決策が少し厄介なようです

例2

アプリケーションは、ロードされた実行中のプラグインの新しいバージョンをダウンロードします。プラグインは、ある種のインストーラーに含まれています。インストーラーはホストを正常に閉じ、既存のプラグインをアーカイブします。インストーラーは新しいプラグインをインストールし、ホストアプリを再起動します。

---これも少し厄介なようです

私は自分の仮定の修正、または自分の目標を達成するための成功した戦略への洞察を求めています。

4

1 に答える 1

3

.NET Frameworkには、ロードされたアセンブリを更新できるシャドウコピーと呼ばれる機能があります。基本的に、アセンブリを一時フォルダにコピーし、そこからロードします。このようにして、アプリケーションのインストールフォルダーにあるアセンブリがOSによってロックされることはなく、それらを置き換えることができます。ASP.NET、単体テストframweorks、およびその他の多くのアプリケーションは、シャドウコピーを使用します。

この機能を有効にするAppDomainには、メインでシャドウコピーを有効にできないため、アプリケーションを新しいものにロードする必要がありますAppDomainAppDomainを作成してそこでアプリケーションを実行する単純なローダーを作成できます。これは非常に簡単です。MEF +シャドウコピーの例については、GlennBlockのMEFの方法と特にPartUpdatesInPlaceサンプルをご覧ください。

バージョニングに関する限り、同じアプリケーションドメインに2つ以上のバージョンのアセンブリを同時にロードできる必要があります。これを行うには2つの方法があります。

  1. GACの強力な名前付きアセンブリ。
  2. 名前に含まれているバージョン(Plugin.v1.dllなど)のアセンブリ。この場合、厳密な命名はオプションですが、それでも良い考えです。このアプローチの利点は、プラグインの2つ以上のバージョンが同じディレクトリに共存できることです。

MEF +バージョニングの例については、この回答をご覧ください。

MEFの再構成機能を使用して、プラグインコンテナを次の後に更新することもできます。

  • 新しいプラグインアセンブリが追加されました
  • プラグインアセンブリが削除されます
  • プラグインアセンブリが置き換えられます

例については、この質問をご覧ください。

于 2013-03-02T20:01:46.657 に答える