0

アプリケーション (.NET、WinForms 3.5) 用の単純なプラグイン フレームワークを設計する必要があります。

拡張ポイントは、特定の操作を実行するために、ユーザーがプラグインを使用して「フック」できるいくつかのアプリケーション イベント/シナリオになります。

これを機能させたい方法は次のとおりです。

  1. ユーザーがプラグイン DLL (特定の基本クラスから派生した型を含む/何らかの方法でマークされた型を含むアセンブリ) を配置するPluginsフォルダーを用意します。

  2. アプリケーション プラグイン システムでこれらのファイルを検索し、後で使用できるように登録します。

  3. 適切なタイミングで適切なプラグインを呼び出します (例: OnException、OnLog など)。

登録時にプラグイン オブジェクトを作成 (新規作成) すると、DLL がプロセス メモリに読み込まれます。

登録を行う簡単な方法を探しており、必要に応じてプラグインアセンブリを「遅延」ロードするだけです(必要な場合)。

4

2 に答える 2

1

新しいAppDomainに各候補アセンブリをロードし、そのタイプを反映して最後にAppDomainをアンロードする代わりに、Mono.Cecilを試すことができます。次に、次のようなことを行う必要があります。

AssemblyDefinition ad = AssemblyDefinition.ReadAssembly(assemblyPath); 

foreach (TypeDefinition td in ad.MainModule.GetTypes()) 
{ 
    if (td.BaseType != null && td.BaseType.FullName == "MyNamespace.MyAddInBase") 
    {         
        return true; 
    } 
} 

次に、Assembly.LoadFormを使用して適切なアセンブリをロードし、最後に、ニーズに合ったActivator.CreateInstanceオーバーロードを使用してアドインのインスタンスを作成できます。

于 2012-10-16T13:24:14.767 に答える
1

これにはいくつかのオプションがあります。可能であれば、各プラグインにマニフェストまたはそれ自体を説明する他のファイルを提供するように要求し、すべてのマニフェストを調べて、必要に応じて適切なプラグインをロードすることができます。これにより、アセンブリの検査が回避されますが、マニフェストとアセンブリ間の一貫性が必要になるため、注意が必要です。

それ以外の場合は、指摘したように、プラグイン アセンブリを調べるとメモリに読み込まれます。これを回避するために私が発見した唯一の方法は、それらを別の にロードし、AppDomainそれらを調べて必要な情報を取得してから、それをアンロードすることAppDomainです。どこかの PRISM でこれを行う例があります (追跡することができます) が、使用しているフレームワーク (MEF、MAF、PRISM、IoC など) がわかりません。

于 2012-08-27T19:53:21.747 に答える