C# 防止 AppDomain 程序集的类实例访问文件
Posted
技术标签:
【中文标题】C# 防止 AppDomain 程序集的类实例访问文件【英文标题】:C# Prevent class instance of AppDomain assembly from file access 【发布时间】:2014-10-09 20:14:33 【问题描述】:我想加载一个程序集,其中包含一个实现接口的类。 该接口只有一个方法:“Run()”。
我想在完全受限的 AppDomain 中加载类,并阻止实例访问文件或注册表。
这是我的布局:
已签名的主项目 - 加载程序集,创建实例并执行方法 Run() 签名 C# 库 - 仅包含 IProvider 接口定义 外部 C# 库 - 在 MyProvider 类中实现我的接口这是我用来加载外部库、创建实例并执行接口方法的代码:
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 实现了接口但正在访问我的文件系统或更改注册表等
关于如何做到这一点的任何想法?
【问题讨论】:
***.com/questions/1520113/… 或 ***.com/questions/1357231/… 【参考方案1】:您可以从PermissionSet
中删除permissions,例如:
permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));
或者您可以创建一个没有权限的PermissionSet
,然后添加您想要的,如here 所述:
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
【讨论】:
感谢您的快速回答。我认为我的问题是,我没有使用静态函数调用或没有使用 Activator 类。谢谢:)以上是关于C# 防止 AppDomain 程序集的类实例访问文件的主要内容,如果未能解决你的问题,请参考以下文章
在单个 AppDomain 上运行多个应用程序实例时如何防止属性覆盖?
C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载