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)(删除所有空类型)和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 回答