2010-05-19 2 views
6

Je développe un hôte de plug-in. Les plugins devraient avoir aussi peu de confiance qu'ils ont besoin, mais je veux avoir la possibilité pour un plugin de lire et d'écrire des fichiers.Un domaine d'application peut-il être limité à un répertoire?

le AppDomain où l'ensemble peut sera chargé être limité à avoir accès à un seul répertoire pour la lecture et l'écriture?

D'autres options et façons d'y parvenir sont également appréciées comme par exemple des moyens simples de diffuser des données de fichiers de l'hôte vers le plugin (lecture) et du plugin vers l'hôte (écriture).

Si son correspondant: J'utilise l'infrastructure du CRG pour les plug-ins. http://msdn.microsoft.com/en-us/library/bb384200.aspx

+0

Que voulez-vous dire, "un appdomain en C#"? AppDomains font partie du .NET Framework et ne font pas partie de C#. –

+0

double possible de [Limiter l'accès au plug-in système de fichiers et réseau via appdomain] (http://stackoverflow.com/questions/1357231/restrict-plugin-access-to-file-system-and-network-via-appdomain) – Gonzalo

+0

Oui, je voulais dire .Net, je suis tellement habitué à C# ils sont presque équivalents pour moi :) Quant à la double question, désolé je pas vu que l'un avant posté. C'est presque ce dont j'ai besoin pour pouvoir l'adapter. – Caerbanog

Répondre

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