![]() |
1
1
对于一个插件模型,我会看看
强迫
关于第一点“添加对插件项目的引用”。好吧,这将使一个处于一个困难的境地,阻止将来的可扩展性。如果…怎么办 我 想要制作一个新的插件吗?哎哟,现在你没有引用它,所以我想我的插件不会工作了?这就是为什么需要另一种方法。我们将“探测”插件程序集。
笔记
最后,.NET3.5支持插件模型(System.AddIn),还可以查看Microsoft发布的托管可扩展性框架,该框架允许开发人员构建简单的 组合的 http://www.codeplex.com/MEF ) |
![]() |
2
1
只需在您的解决方案中包含插件项目,但只需要从插件到“应用程序”项目的依赖关系。通过保留一个重复的解决方案(但只包含应用程序项目)并确保构建干净来实现这一点。您可能还想考虑一个生成后的步骤,它尝试单独构建每个插件项目而不需要其他的构建。
我赞成使用 MEF 在编译时您的插件实际上是已知的,只是不知道您计划加载哪个特定版本的dll。 |
![]() |
3
1
设置项目,以便将可执行文件编译到1个位置,并将“插件”编译到相同的位置。您可以使用交叉点使“bin”成为通往最终位置的路径。 此外,在插件项目中,将可执行文件设置为调试主机。 如果您还没有这样做,请确保您的接口没有在每次编译Exe时重新编译(如果它是强名称的),因为这将迫使您在每次重新编译主机Exe时都必须重新编译每个插件。 |
![]() |
4
1
plugin system 不久前使用反射。这种机制类似于drupal中使用的机制,我发现它非常灵活。 Sistema de plugins con C#. Parte I. Conceptos 和 Sistema de plugins con C#. Parte II. El código explicado 但我还没有时间翻译它们(所以它们是西班牙语的)。尽管如此,代码还是用英语注释的(如果我没记错的话)。
基本上,您有通常定义的插件,实现简单接口的类。此接口描述加载、卸载、安装、卸载和配置插件的方法。
首先,插件可以通过实现公共(已知)接口并使用“ServiceAttribute”将自身标记为服务,从而向其他类提供服务。插件系统将注册该服务,并将其公开给任何有兴趣使用它的人。例如:
另一方面,你有钩子。钩子是插件事件。您有两个属性HookAttribute和HookableAttribute。 当您将一个方法声明为可挂接时,您是在说您希望它被其他插件拦截。例如
在其他插件中
只要签名匹配,钩子签名(委托)就可以是未知的。同样,插件系统会处理匹配项并将其放到一起。
顺便说一下,我使用了一个插件子文件夹来放置插件。只要插件项目是我正在开发的解决方案的一部分,我就可以从VS调试它们。我不需要引用它们或其他任何东西,如果插件是解决方案的一部分,那么我就能够调试它。 |