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

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载

C#动态加载dll 时程序集的卸载问题

如何在新的 AppDomain 中运行从加载到引用的程序集的方法

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载