私はプラグインを動的にロードすることにちょっとこだわっています:
理論: (プラグイン) 特定のフォルダー内の 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
->しかし、どのように?
あなたが助けてくれることを願っています!
前もって感謝します!ロビン