2010-05-19 5 views
6

Ich entwickle einen Plugin-Host. Die Plugins sollten so wenig Vertrauen haben, wie sie brauchen, aber ich möchte die Möglichkeit haben, dass ein Plugin Dateien lesen und schreiben kann.Kann eine Anwendungsdomäne auf ein Verzeichnis beschränkt werden?

Kann die AppDomain, in die die Assembly geladen wird, nur Zugriff auf ein Verzeichnis zum Lesen und Schreiben haben?

Andere Möglichkeiten und Möglichkeiten, dies zu tun sind auch geschätzt wie zum Beispiel einfache Möglichkeiten, Datei-Daten vom Host zum Plugin (Lesen) und vom Plugin zum Host (Schreiben) zu streamen.

Wenn relevant: Ich verwende die MAF-Infrastruktur für die Plugins. http://msdn.microsoft.com/en-us/library/bb384200.aspx

+0

Was meinen Sie, "eine appdomain in C#"? Anwendungsdomänen sind Teil von .NET Framework und nicht Teil von C#. –

+0

mögliches Duplikat von [Plugin-Zugriff auf Dateisystem und Netzwerk über App-Domäne beschränken] (http://stackoverflow.com/questions/1357231/restrict-plugin-access-to-file-system-and-network-via-appdomain) – Gonzalo

+0

Ja, ich meinte .Net, ich bin nur so gewöhnt, C# sie sind fast gleichwertig zu mir :) Was die doppelte Frage betrifft, entschuldige ich, dass ich es nicht sah, bevor ich gepostet habe. Es ist fast das, was ich brauche, damit ich es anpassen kann. – Caerbanog

Antwort

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