2010-05-19 74 views
6

我正在開發一個插件主機。插件應該儘可能少的信任,但我希望有一個插件讀取和寫入文件的可能性。應用程序域可以限制在一個目錄嗎?

可以在那裏組裝將被加載的AppDomain中被限制只能訪問一個目錄,閱讀和寫作?

其他選擇和途徑去了解這個也很受青睞例如像簡便的方法,從主機到插件(在讀),並從插件到主機(寫)流文件的數據。

如果其相關:我使用了插件的MAF基礎設施。 http://msdn.microsoft.com/en-us/library/bb384200.aspx

+0

你是什麼意思,「在C#中的應用程序域」? AppDomain是.NET Framework的一部分,不屬於C#的一部分。的[限制到經由應用程序域文件系統和網絡訪問插件] – 2010-05-19 22:44:49

+0

可能重複(http://stackoverflow.com/questions/1357231/restrict-plugin-access-to-file-system-and-network-via-appdomain) – Gonzalo 2010-05-19 22:51:13

+0

是的,我的意思的.Net,我只是習慣了C#,他們幾乎等同於我:) 至於重複的問題,對不起,我沒能看到我發佈的前一個。它幾乎是我需要的,所以我可能會適應它。 – Caerbanog 2010-05-19 22:57:44

回答

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(); 
     } 
    } 
} 
相關問題