1

我写了一个插件系统,插件主机需要知道每个模块有哪些“使用”。

主要思想是限制插件可以在代码中使用的内容,以评估其安全级别。示例:插件无法操作磁盘或网络,那么我正在考虑通过“使用”或加载的 dll 来限制。

我搜索了如何获取插件的“加载模块”,但我没有找到 System.IO 的参考或任何可以提供帮助的 dll。

然后我查看 assembly.Get***() (modules/fields/...)

也许一个axemple可以帮助:插件'A'EntryPoint.cs

using System.Collections.Generic; <--- is allowed
using System.IO;  <--- it is not allowed
using System.Net;  <--- it is not allowed
.... Declare a namsespace, classes and other... AND i used a streamwriter

我需要知道插件是否使用 System.Net 或其他禁止引用。

谢谢(非常感谢所有可能性)

编辑:1)Assembly.GetReferencedAssemblies 不起作用,某些 DLL 具有允许和禁止的引用

2)磁盘/网络访问可以使用一些管理此访问的“帮助库”来完成。

3)沙盒解决方案:我看到了这个,但主要问题是我有一个虚拟磁盘之类的东西,当用户要求列出一个目录时,这个操作会询问服务器“这个用户在这个文件夹中有什么文件?” 然后此服务器将收集数据库中的所有文件并返回此列表。当必须读取/写入文件时,需要同步此修改。与可以读取此文件的所有其他计算机。网络操作特定于一系列“虚拟合作伙伴”,但没有完整的 VPN 解决方案。

4

3 回答 3

4

这是不可能的。using只是一个语法助手,可以让您免于完全限定您想从另一个命名空间使用的所有内容。

如果您想以受限权限运行一段代码,则可以通过将其加载到具有受限信任的单独应用程序域中来实现。这是一篇可能会有所帮助的文章。

于 2012-08-27T01:59:09.000 回答
2

Assembly.GetReferencedAssemblies将为您提供程序集的依赖项。

于 2012-08-27T01:44:54.280 回答
1

看一下System.Addins命名空间。这使您可以在部分受信任的环境中安全地枚举和加载插件。

这个 SO question的回答也可能会有所帮助,尤其是对插件的强命名。

于 2012-08-27T01:52:25.497 回答