使用(程序集)引用主机应用程序的插件

时间:2011-07-13 17:38:39

标签: .net architecture plugins mef

我正在开发一个我希望使用插件扩展的应用程序。

在这里,我发现了很多关于使用MEF的建议,这是一个从目录加载插件DLL的简单解决方案。 常见的方法是设置一个基类或接口,插件必须继承/实现并在库程序集中包含该类/接口,即PluginBase.dll,应用程序和插件都将引用它。

使用此tecnique时遇到两个问题:

  1. 共享课程

    主应用程序中的类也应该可用于插件。

    显而易见的解决方案是将它们移动到公共库程序集,但我认为在PluginBase.dll中使用thoose类是不正确的,因为它们与插件体系结构无关。

    我也可以为这些类创建一个单独的DLL但这意味着第二个dll应该在启动时加载并包含在开发插件中(不是真正的问题,但我更喜欢新手只添加一个参考)。

  2. 会员知名度

    这是真正的问题:我还在编写对应用程序有更多控制权的内部插件。

    由于内部使用类型的任何成员都需要将其类移动到PluginBase.dll,我必须继承其他2种类型的基本插件类(普通插件和内部插件),并且只将基类和普通类放在PluginBase.dll。但实际上情况更糟,因为插件可以有一个GUI或者没有,所以在一天结束时一切都加倍......这太乱了。

  3. 解决方案(是吗?)

    我发现我可以直接在插件项目中添加对主应用程序的引用,这样做我可以轻松访问任何类。但是,隐藏类/成员只是一个问题,或者使用内部可见性说明符。 没有要实现的接口,没有其他程序集在​​启动时加载,它看起来更快,更简单,更有效。

    我是否应该注意使用这种方法的副作用?

2 个答案:

答案 0 :(得分:0)

我这样做的方式与此相同:http://rickrat.wordpress.com/2011/01/24/using-mef-to-link-view-model-locator-and-load-assembly-uis-dynamically/ enter image description here

应用程序和插件不需要彼此了解,他们只需要引用共享合同程序集。

提醒:确保您的共享合同dll是使用公钥签名的,因为如果MEF在addin文件夹中找到它(它可能是),它会尝试加载它两次。拥有一个公钥,它会根据已经加载的内容进行检查,并且不会再次加载它。

答案 1 :(得分:0)

如果你正在使用WPF,那么你需要看Prism它是一个不错的,可能会帮助你制作基于插件的应用程序。