我写了一个插件系统,插件主机需要知道每个模块有哪些“使用”。
主要思想是限制插件在代码中可以使用的内容,以评估它的安全级别。 例如:插件无法操作磁盘或网络,然后我在考虑使用'使用'或加载的dll。
我找到了如何获取插件的'Loaded Modules',但我没有找到System.IO或任何可能有用的dll的引用。
然后我看看assembly.Get ***()(modules / fields /...)
也许一个简单的帮助:插件'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有Allowed和Prohibeted引用
2)可以使用一些管理此访问权限的“帮助库”来完成磁盘/网络访问。
3)对于Sandbox解决方案:我看到了这一点,但主要问题是我有类似虚拟磁盘的东西,当用户要求列出目录时,此操作将询问服务器'此用户在此具有哪些文件夹?'然后此服务器将收集数据库中的所有文件并返回此列表。当必须对文件进行readed / writed时,这些修改需要同步。与所有其他可以读取此文件的计算机。网络操作特定于一系列“虚拟合作伙伴”,但没有完整的VPN解决方案。
答案 0 :(得分:4)
这是不可能的。 using
只是一个语法助手,可以帮助您完全限定从另一个命名空间中使用的所有内容。
如果您想运行一段具有受限权限的代码,那么您可以通过将其加载到具有有限信任的单独应用程序域中来实现此目的。 Here's an article that may help.
答案 1 :(得分:2)
Assembly.GetReferencedAssemblies将为您提供程序集的依赖项。
答案 2 :(得分:1)
查看System.Addins
命名空间。这允许您在部分受信任的环境中安全地枚举和加载插件。
this SO question的答案也可能有所帮助,特别是对插件的强烈命名。