
[英]C# Reflection, AppDomain: Execute same assembly from different folders
[英]C# Prevent class instance of AppDomain assembly from file access
我想加载一个程序集,其中包含一个实现接口的类。 该接口只有一个方法:“ Run()”。
我想在完全受限的AppDomain中加载该类,并阻止实例从文件或注册表访问。
这是我的布局:
这是我用于加载外部库,创建实例并执行接口方法的代码:
Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet permSet = SecurityManager.GetStandardSandbox(ev);
StrongName fullTrustAssembly = typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();
AppDomainSetup adSetup = new AppDomainSetup()
{
ApplicationBase = Path.GetFullPath(Environment.CurrentDirectory)
};
AppDomain newDomain = AppDomain.CreateDomain("Sandbox", ev, adSetup, permSet, fullTrustAssembly);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes("ExternalLib.dll"));
var instance = asm.CreateInstance("ExternalLib.MyProvider", true);
IProvider provider = instance as IProvider;
//Should not work, because my Assembly is accessing a file/Registry or something else
string result = provider.Run("Test");
我希望最后一行抛出异常,因为ExternalLib.dll实现了接口,但是正在访问我的文件系统或更改注册表等
关于如何做到这一点的任何想法?
您可以删除的权限从PermissionSet
,如:
permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));
或者你可以创建一个PermissionSet
,没有权限,然后添加你想要的,如概述在这里 :
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.