2014-10-09 1 views
1

Я хочу загрузить сборку, которая содержит один класс, который реализует интерфейс. Интерфейс имеет только один метод: «Run()».C# Предотвратить экземпляр класса сборки AppDomain из доступа к файлам

Я хочу загрузить класс внутри полностью ограниченного AppDomain и предотвратить доступ экземпляра из файла или доступа к реестру.

Это мой макет:

  • Подписанные Основной проект - Нагрузки Ассамблеи, создает экземпляр и выполняет метод Run()
  • Подпись C# библиотека - Просто содержит определение IProvider интерфейса
  • Внешний C# Библиотека - реализует мой интерфейс в классе MyProvider

Это код, который я использую для загрузки внешней библиотеки, создания экземпляра и выполнения интерфейса metho d:

 Evidence ev = new Evidence(); 
     ev.AddHostEvidence(new Zone(SecurityZone.Internet)); 
     PermissionSet permSet = SecurityManager.GetStandardSandbox(ev); 

     StrongName fullTrustAssembly = typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>(); 

     AppDomainSetup adSetup = new AppDomainSetup() 
     { 
      ApplicationBase = Path.GetFullPath(Environment.CurrentDirectory) 
     }; 

     AppDomain newDomain = AppDomain.CreateDomain("Sandbox", ev, adSetup, permSet, fullTrustAssembly); 

     Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes("ExternalLib.dll")); 
     var instance = asm.CreateInstance("ExternalLib.MyProvider", true); 

     IProvider provider = instance as IProvider; 

     //Should not work, because my Assembly is accessing a file/Registry or something else 
     string result = provider.Run("Test"); 

Я хочу, чтобы последняя строка, чтобы выбросить исключение, потому что ExternalLib.dll реализует интерфейс, но доступ к моей файловой системы или изменения реестра и т.д.

Любые идеи о том, как это сделать?

+0

HTTP : //stackoverflow.com/questions/1520113/restrict-plug-in-assembly-code-access или http://stackoverflow.com/question s/1357231/restrict-plugin-access-to-file-system-and-network-via-appdomain –

ответ

3

Вы можете удалить permissions из PermissionSet, например:

permSet.RemovePermission(typeof(FileIOPermission)); 
permSet.RemovePermission(typeof(RegistryPermission)); 

Или вы можете создать PermissionSet без каких-либо разрешений, а затем добавить те, которые вы хотите, как указано here:

PermissionSet permSet = new PermissionSet(PermissionState.None); 
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
+0

Спасибо за быстрый ответ. Я думаю, что моя проблема заключалась в том, что я не использовал статический вызов функции или не использовал класс Activator. Благодаря :) – DoubleVoid