有没有办法阻止C#插件访问程序中的主C#应用程序?

前端之家收集整理的这篇文章主要介绍了有没有办法阻止C#插件访问程序中的主C#应用程序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个程序和一个简单的插件架构,其中插件实现通用接口,主程序加载实现此接口的所有插件.这是迄今为止我发现的最常见的自定义插件架构,所以我正在使用它.

我没有使用微软的MEF,我有理由不这样做.我会留下它.

问题在于,当加载插件时,无论它们对主程序有多么“盲目”,它都是表单/类/等.它仍然可以访问System.Windows.Forms.Application,因此可以访问我的应用程序及其当前运行的表单/方法/控件/等.

我不想要这个.有没有办法限制插件对主应用程序的访问?

编辑:有关该插件的更多信息

我们(我的老板和我)目前正在讨论插件需要做什么.他们显然都需要添加功能,但我们最初决定让每个插件访问当前运行的表单,以便它可以直接向表单添加控件和事件.这是基于这样的假设:只有我们开发人员才会编写它们.

现在我们正在考虑第三方插件的可能性,显然,原始设计与开放式门上的“请勿进入”标志具有相同的安全性,周围没有人.

或者万圣节时挂在一碗个人吃喝玩乐上的“Take One”标志.

解决方法

这样做的一种方法是将您的插件托管在自己的AppDomain中.您可以将这些AppDomain配置为具有有限的安全性,以防止它们访问主AppDomain中的资源.这确实使事情变得复杂,但会给你带来的沙子拳击.

从AppDomain托管中获得的另一个好处是,如果您希望刷新插件,可以加载和卸载这些域,此外,您可以保护主AppDomain免受“子”域中的崩溃.

更新

看到你的更新后重新开始.如果您的插件必须能够直接访问UI元素,那么您的插件功能将无法提供帮助,例如:访问表单以添加控件.您将无法通过AppDomain边界直接访问表单,也无法在一个AppDomain中生成控件,然后将它们编组到另一个AppDomain中.

您仍然可以考虑在另一个AppDomain中托管插件,但是您需要考虑某种代理机制,以便可以代表插件为表单添加控件等操作,而不是让插件直接访问表单.例如,您可以传入一个表单构建器对象,该对象具有AddButton等方法.然后,代理可以代表主域中的插件执行这些操作.通过这种方式,您可以为插件提供有限的API以及所需的事件.

这种方法绝不是微不足道的,但是一旦掌握了基础知识,它就不会太复杂.

更新2

自从在当天推出自己的AppDomins插件框架以来,事情已经发生了变化.自3.5版插件以来,现在已经支持.Net框架:

MAF – Managed Addin Framework / System.Addin

支持插件的AppDomain隔离模式,并具有插件加载器等.无需自己滚动.

猜你在找的C#相关文章