【发布时间】:2017-03-30 15:43:17
【问题描述】:
我有点被动态加载插件所困扰:
理论:(插件)特定文件夹中的 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-> 但是如何?
希望你能帮上忙!
提前致谢! 罗宾
【问题讨论】:
标签: c# plugins reflection .net-assembly assemblyresolve