我没有使用微软的MEF,我有理由不这样做.我会留下它.
问题在于,当加载插件时,无论它们对主程序有多么“盲目”,它都是表单/类/等.它仍然可以访问System.Windows.Forms.Application,因此可以访问我的应用程序及其当前运行的表单/方法/控件/等.
我不想要这个.有没有办法限制插件对主应用程序的访问?
编辑:有关该插件的更多信息
我们(我的老板和我)目前正在讨论插件需要做什么.他们显然都需要添加功能,但我们最初决定让每个插件访问当前运行的表单,以便它可以直接向表单添加控件和事件.这是基于这样的假设:只有我们开发人员才会编写它们.
现在我们正在考虑第三方插件的可能性,显然,原始设计与开放式门上的“请勿进入”标志具有相同的安全性,周围没有人.
或者万圣节时挂在一碗个人吃喝玩乐上的“Take One”标志.
解决方法
从AppDomain托管中获得的另一个好处是,如果您希望刷新插件,可以加载和卸载这些域,此外,您可以保护主AppDomain免受“子”域中的崩溃.
更新
看到你的更新后重新开始.如果您的插件必须能够直接访问UI元素,那么您的插件的功能将无法提供帮助,例如:访问表单以添加控件.您将无法通过AppDomain边界直接访问表单,也无法在一个AppDomain中生成控件,然后将它们编组到另一个AppDomain中.
您仍然可以考虑在另一个AppDomain中托管插件,但是您需要考虑某种代理机制,以便可以代表插件为表单添加控件等操作,而不是让插件直接访问表单.例如,您可以传入一个表单构建器对象,该对象具有AddButton等方法.然后,代理可以代表主域中的插件执行这些操作.通过这种方式,您可以为插件提供有限的API以及所需的事件.
这种方法绝不是微不足道的,但是一旦掌握了基础知识,它就不会太复杂.
更新2
自从在当天推出自己的AppDomins插件框架以来,事情已经发生了变化.自3.5版插件以来,现在已经支持.Net框架: