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