Я добавляю слой песочницы в созданную мной структуру.
Основная концепция заключается в том, что фреймворк загружает библиотеки DLL, подобные плагинам.
При загрузке плагина я создаю AppDomain, чтобы изолировать выполнение, устанавливаю ApplicationBase AppDomain в каталог DLL и устанавливаю полный доступ.
Теперь проблема в том, что внутри плагинов, хотя базовый путь установлен правильно, если код пытается загрузить файл, используя его относительный путь, .net вызовет исключение System.Security.Permissions.FileIOPermission.
Однако тот же файл будет легко загружен с использованием абсолютного пути.
Я пробовал разные наборы разрешений безопасности, но никто не решает проблему загрузки относительного пути.
Вот код, который я использую:
//AppDomain creation
string directory = Path.GetDirectoryName(assemblyPath);
PermissionSet permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, directory));
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Infrastructure));
AppDomainSetup appDomainSetup = new AppDomainSetup
{
ApplicationBase = directory,
PrivateBinPath = directory,
PrivateBinPathProbe = directory
};
AppDomain appDomain = AppDomain.CreateDomain("Sandbox", null, appDomainSetup, permissionSet);
//Code running inside the AppDomain
string path = File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,Path.Combine("Resources","Image.jpg"))); //Works fine
string path = Path.GetFullPath(Path.Combine("Resources","Image.jpg")); //Throws System.Security.Permissions.FileIOPermission exception
Я знаю, что могу просто пойти по первому пути, но я хочу, чтобы фреймворк был как можно более гибким, поэтому я предпочитаю найти обходной путь для этой проблемы.
Может ли кто-нибудь помочь с любым решением или предложениями, пожалуйста?