一个appdomain可以限制在一个目录吗?

Posted

技术标签:

【中文标题】一个appdomain可以限制在一个目录吗?【英文标题】:Can an appdomain be restricted to one directory? 【发布时间】:2010-05-19 22:35:27 【问题描述】:

我正在开发一个插件主机。插件应该尽可能少地信任它们,但是我希望插件能够读取和写入文件。

能否将加载程序集的 AppDomain 限制为只能访问一个目录进行读写?

其他选项和方法也值得赞赏,例如将文件数据从主机流式传输到插件(读取)和从插件到主机(写入)的简单方法。

如果相关:我正在为插件使用 MAF 基础架构。 http://msdn.microsoft.com/en-us/library/bb384200.aspx

【问题讨论】:

“C# 中的应用程序域”是什么意思? AppDomain 是 .NET Framework 的一部分,而不是 C# 的一部分。 Restrict plugin access to file system and network via appdomain的可能重复 是的,我的意思是 .Net,我只是习惯了 c#,它们几乎等同于我 :) 至于重复的问题,抱歉,我在发布之前没有看到那个问题。它几乎是我需要的,所以我可以适应它。 【参考方案1】:
namespace ConsoleApplication

    #region Imports

    using System;
    using System.IO;
    using System.Security;
    using System.Security.Permissions;

    #endregion

    public class Plugin : MarshalByRefObject
            
        public string TestRead(string path)
        
            try
            
                File.ReadAllBytes(path);
                return "Done";
            
            catch (SecurityException)
            
                return "Access Denied";
            
        
    

    public class Program
    
        static void Main(string[] args)
        
            var setup = new AppDomainSetup();

            setup.ApplicationBase = 
                AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

            var perm = new PermissionSet(PermissionState.None);

            perm.AddPermission(
                new SecurityPermission(
                    SecurityPermissionFlag.Execution));

            perm.AddPermission(
                new FileIOPermission(
                    FileIOPermissionAccess.Read, "c:\\public\\"));

            var pluginDomain = 
                AppDomain.CreateDomain("PluginDomain", null, setup, perm);

            var plugin = 
                pluginDomain.CreateInstanceAndUnwrap(
                    typeof(Plugin).Assembly.FullName,
                    typeof(Plugin).FullName) as Plugin;

            Console.WriteLine(plugin.TestRead("c:\\public\\test.txt"));
            Console.WriteLine(plugin.TestRead("c:\\secret\\test.txt"));
            Console.ReadKey();
        
    

【讨论】:

以上是关于一个appdomain可以限制在一个目录吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?

限制插件汇编代码访问

从 App.Config 将程序集加载到 AppDomain

AppDomain 的 CPU 和内存上限

Log4net 可以在新创建的 AppDomain 中运行吗

我可以在我的 IIS 托管网站中跨 AppDomain 共享 dll 吗?