c#Assembly.LoadFrom与动态AssemblyResolve

时间:2017-03-30 15:43:17

标签: c# plugins reflection .net-assembly assemblyresolve

我有点动态加载插件:

理论:(插件)特定文件夹中的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可以使用virtual / abstract强制;但是在创建实例之前无法访问(那些AssemblyResolveEvents被触发),所以没有帮助
  • 在每个插件中都有一个特定dll路径的(静态)字典 - >可以在实例化之前使用Reflection读取,但我无法将其作为已定义的模板添加到myPluginBaseClass,因此可能出错
  • 为每个插件创建一个单独的域,让他们处理自己的AssemblyResolveEvent - >但是怎么样?

希望你能帮忙!

提前致谢! 罗宾

1 个答案:

答案 0 :(得分:1)

创建域似乎是插件模式的充分解决方案。

您不需要定义AssemblyResolve,您只需配置AppDomain可以找到依赖项的目录。

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