我有点坚持使用动态加载插件:
理论:(插件)特定文件夹中的 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
-> 但是如何?
我希望你能帮忙!
提前致谢!罗宾