我有点动态加载插件:
理论:(插件)特定文件夹中的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)来解决
现在问题在于:引用的缺失程序集是针对每个已实现的插件而定的,因此我需要在每个插件中实现单独的搜索行为。到目前为止我的想法/解决方案:
myPluginBaseClass
可以使用virtual / abstract强制;但是在创建实例之前无法访问(那些AssemblyResolveEvents
被触发),所以没有帮助myPluginBaseClass
,因此可能出错AssemblyResolveEvent
- >但是怎么样?希望你能帮忙!
提前致谢! 罗宾
答案 0 :(得分:1)
创建域似乎是插件模式的充分解决方案。
您不需要定义AssemblyResolve,您只需配置AppDomain可以找到依赖项的目录。
https://msdn.microsoft.com/fr-fr/library/system.appdomainsetup.applicationbase(v=vs.110).aspx