代码之家  ›  专栏  ›  技术社区  ›  Caerbanog

是否可以将AppDomain限制为一个目录?

  •  6
  • Caerbanog  · 技术社区  · 16 年前

    我正在开发一个插件主机。插件应该没有他们需要的信任,但是我希望有一个插件读写文件的可能性。

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

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

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

    1 回复  |  直到 16 年前
        1
  •  6
  •   Diadistis    16 年前
    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();
            }
        }
    }