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

时间:2010-05-19 22:35:27

标签: c# plugins appdomain

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

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

其他选项和方法也很受欢迎,例如将文件数据从主机流式传输到插件(读取)以及从插件传输到主机(写入)的简单方法。

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

1 个答案:

答案 0 :(得分:6)

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();
        }
    }
}