我正在为我创建的框架添加一个沙盒层。
主要概念是框架加载类似插件的DLL。
在加载插件时,我创建了一个AppDomain来隔离执行,并将AppDomain的ApplicationBase设置为DLL的目录,并将访问权限设置为full。
现在的问题是,在插件内部,尽管基本路径设置正确,但如果代码试图使用其相对路径加载文件,.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
我知道我可以选择第一种方法,但我希望框架尽可能灵活,因此我更喜欢找到解决这个问题的方法。
有人能提供任何解决方案或建议吗?
没关系,
我自己找到了问题的答案。
我必须将AppDomain的Environment.CurrentDirectory
设置为正确的值。