9

プラグインのようなアプリケーションを実装しようとしています。すでにいくつかの解決策があることは知っていますが、これは概念実証にすぎず、それ以上のものではありません。アイデアは、アプリケーションのメインアプリケーションをデフォルトでほとんど機能なしにし、プラグインに相互に通知して、必要なすべての機能を実装させることです。

いくつかの問題が発生します。

  1. 実行時にプラグインがアプリケーションを通じて相互に認識できるようにしたい。これは、コード時に他のプラグインのアセンブリを参照できず、そのインターフェイスを使用できることを意味するのではなく、プラグイン機能の初期化は常にメインアプリを介して行う必要があります。たとえば、プラグインXとYの両方をロードしていて、YがXの機能を使用したい場合、アプリケーションがその機能を使用するために、その関心を「登録」する必要があります。ロードされたすべてのプラグインを保存するアプリケーションには、一種の「辞書」が必要です。私のアプリケーションへの関心を登録した後、プラグインYはXへの参照を取得して、それを使用できるようにします。これは良いアプローチですか?
  2. Xを使用するプラグインYをコーディングするときは、Xのアセンブリを参照する必要があるため、そのインターフェイスに対してプログラミングできます。それにはバージョン管理の問題があります。古いバージョンのプラグインXに対してプラグインYをコーディングするとどうなりますか?常に最新バージョンのアセンブリが存在する、すべてのアセンブリがある「中央」の場所を常に使用する必要がありますか?

.NETのこの種のデザインを具体的に扱っている本は偶然ありますか?

ありがとう

編集:私が行った2つの質問から人々は離れていると思います。MEFと#developの両方を見ることができますが、私が行った質問に対する具体的な回答を得たいと思います。

4

5 に答える 5

6

MEFを調べることをお勧めします。これは、.NETでプラグインを実行する新しい方法です。たとえば、VS2010の新しいアドインを作成するための推奨される方法です。私自身は使ったことがありませんが、調べてみたところとても良さそうです。他の人の提案の答えとしてこれを追加します:)

于 2010-05-07T23:38:14.267 に答える
3

System.AddIn名前空間を調べます。MEFよりも少しレベルが低いので、探している「自分で実装する」エクスペリエンスが得られるはずです。

于 2010-05-07T21:59:19.030 に答える
2

探しているものを構築するための優れた本があります。C#アプリケーションの分析:SharpDevelopの内部。リンクは次のとおりです:http ://www.icsharpcode.net/OpenSource/SD/InsideSharpDevelop.aspx

SharpDevelopアプリケーションは完全にプラグインベースであり、この本では、どのように構築したか、直面した落とし穴、およびどのように克服したかについて説明しています。この本はサイトから無料で入手できますが、購入することもできます。

于 2010-05-07T22:39:29.037 に答える
1

この例を使用してそれを行ったら。私はそれが好きでした、しかしそれは数年前でした、私は今より良い解決策があるかもしれないと思います。私が覚えている限り、基本的な考え方は、プログラムに抽象クラスがあり、プラグインはそのクラスを継承し、DLLとしてコンパイルされます...またはインターフェイスを使用して同様のものです。とにかく、そのアプローチは私にとって素晴らしいものでした。後でfilesystemwatcherを追加して、実行中にそれらのDLLプラグインをロードできるようにしました。

アセンブリをロードするには

アセンブリが公開するタイプを取得するには

于 2010-05-07T22:18:33.370 に答える
0

あなたが暴露した2つの特定の問題について:

1)何を達成しようとしているのかわかりませんが、機能の初期化を遅らせ、アドインの読み込みを遅らせたいと思います。それが目標であれば、あなたが提案していることはうまくいくかもしれません。したがって、次のように機能する可能性があります。

  • Yプラグインは、使用する必要のある機能のリストを提供します(たとえば、特定のインターフェースの実装またはxmlマニフェストを介して実行できます)。
  • Xアドインは、Initialize(featureId)のようなメソッドを使用して、機能を初期化できるAPIを実装します。
  • ホストアプリケーションは、Yに必要な機能リストを取得し、Xプラグインをロード/初期化し、機能ごとにInitializeを呼び出します。
  • ホストアプリケーションは、Xで実装される「機能」オブジェクトへの参照を取得するためにYが使用できるGetFeature()メソッドも提供します。

ただし、プラグインYがX APIに直接アクセスできる場合は、機能を登録するためのインフラストラクチャをすべて用意する必要はないと思います。YはXAPIを直接使用してX機能にアクセスするだけで、必要に応じて各機能の初期化を怠ります。たとえば、YはSomeXFeature.DoSomething()を呼び出すだけで、そのクラスの実装は、機能が最初に使用されるときに機能を初期化します。

2)アセンブリのAPIが変更された場合、それに依存するアセンブリが破損する可能性があります。プラグインは他のアセンブリに依存する単なるアセンブリであるため、プラグインも壊れます。この問題を軽減するためにできることがいくつかあります。

  • 各プラグインにバージョン番号を割り当てます。これは単なるアセンブリバージョンである可能性があります。
  • プラグインをロードするときは、すべての依存関係が適切に満たされることを確認してください(つまり、プラグインが依存するすべてのプラグインが存在し、必要なバージョンを持っている必要があります)。依存関係を満たせない場合は、プラグインのロードを拒否します。
  • すべてのプラグインのインストール/アンインストール操作に使用されるプラグイン管理ツールを実装します。マネージャは、依存関係が満たされていないプラグインをインストールしようとしたとき、または他のプラグインが依存しているプラ​​グインをアンインストールしようとしたときに、依存関係を確認してエラーを報告できます。

同様のソリューションがMono.Addinsフレームワークで使用されています。Mono.Addinsでは、各アドインにはバージョン番号と、それが依存するアドイン/バージョンのリストがあります。アドインをロードするとき、アドインエンジンは、正しいバージョンのすべての依存するアドインもロードされることを保証します。また、アドインのインストールを管理するためのAPIとコマンドラインツールも提供します。

于 2010-08-06T17:58:46.337 に答える