11

(他のMEF / MAFの質問については知っていますが、これはより具体的な問題です)

基本的に単純なアドインホスト、GUI、および設定であるWPFアプリケーションを作成したいと思います。実際の作業はすべて、1つ以上のプラグインによって行われます。それらは相互に通信する必要はなく、メインアプリケーションはユーザー入力/コマンドをそれらに送信し、いくつかの結果(たとえば、レンダリングするWPF UI要素)を返します。

さて、アプリケーションのコアはプラグインに基づいているので、それらを管理するための良い方法を選ぶ必要があります。実行時に(たとえば、更新が見つかってダウンロードされたときに)それらをロード/アンロード/リロードできるようにしたい。安定性と安全性のために、おそらく独自のアプリケーションドメインやプロセスで実行する必要があります。

いくつかの調査と実験から、私は3つの選択肢にたどり着きました。

  • System.Addin(MAF):これで必要なことはすべてできるようです。互換性などのために複数のバージョンのAPIを同時に実行できるパイプラインがあります。しかし、何かが足りない場合を除いて、APIを数回作成する必要があります。ホストビューとプラグインビュー、コントラクト、およびコントラクト用の2つのアダプターです。また、(MEFと比較して)情報やリソースはほとんどなく、ほとんどの記事は数年前のものです。これがゆっくりと死んでいくのではないかと心配しており、新しいプロジェクトには使用したくないと思います。

  • MEF:これはもっとシンプルに見えますが、私がコントロールできない魔法がたくさんあり、MAFほどレイヤーが分離されていないようにも感じます。新しいプロジェクトにリンクし、インターフェースを実装すればプラグインが完成する小さなライブラリが欲しいだけです。

  • 手動ロード:最後のオプションは、フォルダーで.dllを手動でスキャンし、リフレクションを使用してプラグインクラスを検索し、インスタンスを作成することです。それは実行可能ですが、アセンブリを手動でロードしたり、個別のプロセス/アプリドメインを作成したりするよりも、何らかのフレームワークを使用したいと思います。

それで、この種のアプリケーションに最適なのはどれですか、それとも私が見逃したものはありますか?

4

1 に答える 1

10

MEFは間違いなく3つの中で最も単純なオプションです。これは、この正確なシナリオ(拡張可能なアプリケーション)を念頭に置いて実際に設計されました。

これは、実際には、WPFアプリケーションであるVisualStudioで使用される「プラグイン」メカニズムです。あなたがする必要があるのは、あなたの「プラグイン」にインターフェースを実装させるか、既知の基本クラスから派生させ、そして[Export]属性を追加することです。アセンブリがメインアプリケーションのカタログに追加されている場合、そのタイプ[Import]はメインアプリケーションが1つのステップで編集できます。この作業を行うための作業はほとんどありません。

別のオプションを選択する強い理由がない限り、それは私の推奨事項です。MAFはより多くの分離をサポートしていますが、使用するのがはるかに難しく、WPFのUIは実際には分離コードではないため、ほとんどの分離機能はWPFアプリケーションでは使用できません。

于 2010-06-24T16:08:06.563 に答える