我正在开发一个我希望使用插件扩展的应用程序。
在这里,我发现了很多关于使用MEF的建议,这是一个从目录加载插件DLL的简单解决方案。 常见的方法是设置一个基类或接口,插件必须继承/实现并在库程序集中包含该类/接口,即PluginBase.dll,应用程序和插件都将引用它。
使用此tecnique时遇到两个问题:
共享课程
主应用程序中的类也应该可用于插件。
显而易见的解决方案是将它们移动到公共库程序集,但我认为在PluginBase.dll中使用thoose类是不正确的,因为它们与插件体系结构无关。
我也可以为这些类创建一个单独的DLL但这意味着第二个dll应该在启动时加载并包含在开发插件中(不是真正的问题,但我更喜欢新手只添加一个参考)。
会员知名度
这是真正的问题:我还在编写对应用程序有更多控制权的内部插件。
由于内部使用类型的任何成员都需要将其类移动到PluginBase.dll,我必须继承其他2种类型的基本插件类(普通插件和内部插件),并且只将基类和普通类放在PluginBase.dll。但实际上情况更糟,因为插件可以有一个GUI或者没有,所以在一天结束时一切都加倍......这太乱了。
解决方案(是吗?)
我发现我可以直接在插件项目中添加对主应用程序的引用,这样做我可以轻松访问任何类。但是,隐藏类/成员只是一个问题,或者使用内部可见性说明符。 没有要实现的接口,没有其他程序集在启动时加载,它看起来更快,更简单,更有效。
我是否应该注意使用这种方法的副作用?
答案 0 :(得分:0)
应用程序和插件不需要彼此了解,他们只需要引用共享合同程序集。
提醒:确保您的共享合同dll是使用公钥签名的,因为如果MEF在addin文件夹中找到它(它可能是),它会尝试加载它两次。拥有一个公钥,它会根据已经加载的内容进行检查,并且不会再次加载它。
答案 1 :(得分:0)
如果你正在使用WPF,那么你需要看Prism它是一个不错的,可能会帮助你制作基于插件的应用程序。