我正在开发一个需要通过插件模块支持自定义的系统。我正在针对接口进行编码,因此插件代码只需要实现这些接口即可插入系统。
// for illustration purposes; not actual code
public interface IPluggable
{
void Setup(PluginConfig c);
bool Process(IProcessable p);
}
我从配置中读取需要加载哪些插件,其中指定了程序集名称和完全限定的类型名称。
<plugin assembly="Foo.Bar.PluginAssembly" type="Foo.Bar.Plugins.AwesomePlugin" />
类型Foo.Bar.Plugins.AwesomePlugin
实现IPluggable
并包含在程序集中的位置Foo.Bar.PluginAssembly.dll
。有了这些信息,我继续创建所需插件的实例。
IPluggable plugin = (IPluggable)Activator.CreateInstance(assemblyName, typeName).Unwrap();
所以我的问题有三个:
- 插件系统的推荐模式是什么?我采取的方法是否有意义,或者我是否遗漏了任何明显的缺陷/警告?
- 动态实例化插件对象是
Activator.CreateInstance()
一个不错的选择吗? - 如何更具体地了解要加载的程序集及其位置?假设我只想从位于
.\plugins
子文件夹中的程序集中加载插件。