4

ここで使用する正確な用語がわからないので、助けていただければ幸いです。

最も単純化すると、フォーム アプリケーションがあります。「form.exe」をロードすると、フォームには 1 つのコントロール、メニューが表示されます。このメニューには、「終了」というメニュー項目が 1 つあります。私が望むのは、フォームがロードされているときに、特殊なメソッドやコントロールなどを追加できるDLLを指定するこのフォームアプリに引数を渡すことができることです.

「form.exe add_plugable.dll」をロードすると、メニューに「追加」という別のメニュー項目が表示されます。「form.exe add_plugable.dll remove_pluggable.dll」を読み込むと、メニューに「Exit」「Add」「Remove」の3項目があります。

これが理にかなっていることを願っています。Forms アプリケーションには何を含める必要がありますか? また、DLL を作成するにはどうすればよいですか? 共通のインターフェイスが必要であることは承知していますが、名前空間とインターフェイス、および抽象クラスを使用してこれを実現する方法が正確にはわかりません。

ありがとう!

4

2 に答える 2

6

Managed Extensibility Frameworkを調べることをお勧めします。これは、まさにこのタイプのシナリオ用に設計されました。

たとえば、これは Visual Studio が拡張性のために使用するものであるため、実行時にアドインを動的に検出してプラグインできます。

于 2012-10-05T17:16:37.720 に答える
5

事前に作成されたフレームワークを使用できますが、「最低限の」ソリューションを探している場合は、これを試してください。

  1. フォーム アプリが呼び出すすべてのメソッドを含むインターフェイス (または必要に応じて一連のインターフェイス) を作成しますIPlugin。インターフェイスを別のクラス ライブラリに配置します。
  2. 各プラグイン DLL で、 を実装するパブリック クラスを作成しますIPlugin
  3. フォーム アプリで、読み込むプラグインと呼び出すタイミングを決定します。このロジックは完全にあなた次第です。

このようなプラグインをロードしてから、インターフェイス メンバーを呼び出して、目的を達成します。必要に応じて、データベースからプラグイン ファイルとクラス名を読み取るapp.configか、命名規則に従って計算することができます。

var pluginAssembly = Assembly.Load(pluginFileName);
var plugin = (IPlugin) pluginAssembly.CreateInstance(pluginClassName);

これらのメソッドにはいくつかのオーバーロードがあり、プロセスをより細かく制御できます。たとえばAssemblyName、単純な文字列ではなく、を使用してプラグイン アセンブリを読み込むことができます。クラスをインスタンス化するときに、クラスのコンストラクターに渡すバインド フラグと一連のパラメーター値を指定できます。

于 2012-10-05T17:49:44.020 に答える