0

私はプラグインを動的にロードすることにちょっとこだわっています:

理論: (プラグイン) 特定のフォルダー内の DLL:

foreach(string path in Directory.GetFiles(...))
{
    Assembly myPlugin = Assembly.LoadFrom(path);
    foreach(Type type in myPlugin.GetTypes().Where(t => typeof(myPluginBaseClass).isAssignableFrom(t)))
    {
        Activator.CreateInstance(type);
    }
}

ここまでは順調ですね。現在、これらのアセンブリに追加の参照に関する問題があります。これは、catch(ReflectionTypeLoadException)(すべての null 型を削除する) およびAppDomain.CurrentDomain.AssemblyResolve += ...(欠落している dll を手動で探す) によって解決できます。

問題は次のとおりです。参照されている不足しているアセンブリは、実装されているプラ​​グインごとに固有であるため、プラグインごとに個別の検索動作を実装する必要があります。これまでの私のアイデア/解決策:

  • メイン アプリケーションに考えられるすべての DLL ディレクトリのグローバル リストがある -> メイン アプリケーション コードを変更せずにさらにプラグインを追加できないため、愚かです
  • 各プラグインに特定の dll パスの (非静的) 辞書を持つ ->myPluginBaseClass仮想/抽象を使用することで強制できます。ただし、インスタンスの作成前 (それらが起動される場所) にはアクセスできないAssemblyResolveEventsため、役に立ちません
  • 各プラグインに特定の dll パスの (静的) 辞書がある -> リフレクションを使用してインスタンス化の前に読み取ることができますがmyPluginBaseClass、定義済みのテンプレートとしてこれを追加できないため、エラーが発生する可能性があります
  • プラグインごとに個別のドメインを作成し、それらに独自のドメインを処理させますAssemblyResolveEvent->しかし、どのように?

あなたが助けてくれることを願っています!

前もって感謝します!ロビン

4

1 に答える 1

2

ドメインの作成は、プラグイン パターンの適切なソリューションのようです。

実際に AssemblyResolve を定義する必要はありません。AppDomain が依存関係を見つけることができるディレクトリを構成するだけで済みます。

https://msdn.microsoft.com/fr-fr/library/system.appdomainsetup.applicationbase(v=vs.110).aspx

于 2017-04-03T10:47:30.307 に答える