none
Проблема с загрузкой сборки. RRS feed

  • Вопрос

  • Есть библиотека в виде сборки, в ней абстрактный класс, есть другая библиотечная сборка где этот класс реализуется. Есть исполняемая сборка которая использует сборку с абстрактным классом, а сборку с его реализацией загружает в отдельный домен с ограниченными разрешениями. Проблема в том что ни как не удаётся загрузить эту сборку с минимальным набором разрешений: требует доступ к файловой системе. Не подскажете как это обойти.

    Вот так работает:

     var permisions=new PermissionSet(null);
          permisions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
          permisions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
    

    Без FileIOPermision выводит вот это:

    Необработанное исключение: System.Security.SecurityException: Сбой при запросе р
    азрешения типа "System.Security.Permissions.FileIOPermission, mscorlib, Version=
    4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".

    Может путь какой указать для доступа?

    • Перемещено Abolmasov Dmitry 4 июля 2011 г. 11:42 (От:Настольные ПК)

Ответы

  • Сделал вот так, кажется с меньшими разрешениями не получится:

    //добавил путь к загружаемой сборке и разрешения на него
        private const string DllPath=@"F:\Projects\ConsoleTest\LibraryTest\bin\Debug";
    
    var permisions=new PermissionSet(null);
          permisions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
          var fileIoPermission=new FileIOPermission(FileIOPermissionAccess.Read,DllPath);                                                         
          fileIoPermission.AddPathList(FileIOPermissionAccess.PathDiscovery,DllPath);
          permisions.AddPermission(fileIoPermission);
    

Все ответы

  • А если задать

    FileIOPermission(PermissionState.None);
    

    ошибка будет возникать?

     

    Еще может стоит указать в самой загружаемой сборке минимальные разрешения, с помощью аттрибута [assembly:]

    Посмотрите - How to: Request Minimum Permissions by Using the RequestMinimum Flag

     


    Для связи [mail]
  • То же самое. Пробовал так дополнительно загружать сборку "mscorlib" как доверенную, не помогает. Это тестовый проект, проверяю возможность вот код:
    //класс исполняемой сборки
    internal class Program{
    
        //текущий католог
        private static readonly string Path=Environment.CurrentDirectory;
    
        //полное имя файла сборки
        private const string DllFile = @"F:\Projects\ConsoleTest\LibraryTest\bin\Debug\LibraryTest.dll";
    
        private static void Main(string[] args){
    
          //загружаем сборку дли иследования и отфилтровываем нужные типы
          var assembly=Assembly.ReflectionOnlyLoadFrom(DllFile);
          AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve+=DomReflectionOnlyAssemblyResolve;
          var types=assembly.GetExportedTypes();
          var printerTypes=types.Where(x=>x.BaseType.FullName=="Library.Printer");
    
          //установки домена
          var setup = new AppDomainSetup() { ApplicationBase = Path };
          var permisions=new PermissionSet(null);
          permisions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
          permisions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
    
          //создание домена
          var dom = AppDomain.CreateDomain("my domain",null,setup,permisions);
          
          //создание объектов
          var printerObjects = printerTypes.Select(x => (Printer)dom.CreateInstanceFromAndUnwrap(DllFile,x.FullName));
    
          //использование объектов
          foreach (var printerObject in printerObjects) {
           printerObject.Print(5);
          }
    
          //проверка какие сборки загружены в текущий домен
          var assymlys=AppDomain.CurrentDomain.GetAssemblies();
          foreach(var assymly in assymlys){
            Console.WriteLine(assymly.FullName);
          }
        }
    
        //обрабатываем событие необходимости загрузки зависимостей
        static Assembly DomReflectionOnlyAssemblyResolve(object sender,ResolveEventArgs args){
          return Assembly.ReflectionOnlyLoad(args.Name);
        }
      }
    
    
    //сборка с абстрактным классом
     /// <summary>
      /// Будет вызываться из другого домена приложений
      /// </summary>
      public abstract class Printer:MarshalByRefObject{
        public abstract void Print(int x);
      }
    
    //сборка с классами реализующими абстрактный класс
     public class Test:Printer {
        public override void Print(int x){
        for (var i = 0;i < x;i++)
          Console.WriteLine(i);
        }
      }
     public class Test_2:Printer{
        public override void Print(int x){
        for (var i = 0;i < x;i++)
          Console.WriteLine("super {0}",AppDomain.CurrentDomain.FriendlyName);
        }
      }
    
     /// <summary>
      /// Класс загружать который мы не будем
      /// </summary>
      public class MyClass{
        
      }
    
    
    
    То что у LINQ ленивые вычисления, я знаю
  • Ну что ник то ни чего не посоветует? Вообще по ТЗ должно быть так: сборки загружаются только с правами на исполнение, а остальные разрешения будут устанавливаться из XML файла при загрузке сборки.
  • Сделал вот так, кажется с меньшими разрешениями не получится:

    //добавил путь к загружаемой сборке и разрешения на него
        private const string DllPath=@"F:\Projects\ConsoleTest\LibraryTest\bin\Debug";
    
    var permisions=new PermissionSet(null);
          permisions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
          var fileIoPermission=new FileIOPermission(FileIOPermissionAccess.Read,DllPath);                                                         
          fileIoPermission.AddPathList(FileIOPermissionAccess.PathDiscovery,DllPath);
          permisions.AddPermission(fileIoPermission);