我正在尝试使用新的应用程序域在更加孤立/受限制的设置中加载应用程序插件/ mod。
这是一场真正的艰难战斗,因为在Mono 2.0(Unity3D)中我可以找到C#4.0+的大多数例子。
我 在加载domain.Load(...)
但基于this article的程序集时出现了FileNotFoundException,因为程序集是“跨域”,因为返回了程序集本身。因此,根据该文章的建议,我正在尝试CreateInstanceAndUnwrap
。
然而,现在我得到了:
TypeLoadException:无法加载类型'Fake.Namespace.TestMod.TestMod'。
// Create a new domain to load this dll in
AppDomain domain = AppDomain.CreateDomain("TestingDomain", null,
new AppDomainSetup {
ApplicationBase = Path.GetDirectoryName(dllFile),
});
IMod mod = (IMod)domain.CreateInstanceAndUnwrap("TestMod", "Fake.Namespace.TestMod.TestMod");
TestMod
是程序集的名称。 Fake.Namespace.TestMod.TestMod
是主类的正确名称空间和类名:
namespace Fake.Namespace.TestMod {
public class TestMod : MarshalByRefObject, IMod {
public TestMod() {
}
}
}
我能找到的唯一建议是验证程序集是否存在(删除它会导致它抛出FileNotFoundException),具有命名空间/类,并且GAC中没有重复(这只是一个简单的DLL我扔进了一个项目目录。)
我还能错过什么?
CreateInstanceAndUnwrap需要Read / PathDiscovery权限,我相信我设置正确:
var ps = new PermissionSet(PermissionState.None);
ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
var f = new FileIOPermission(PermissionState.None);
f.AllLocalFiles = FileIOPermissionAccess.Read;
ps.AddPermission(f);
var f2 = new FileIOPermission(PermissionState.None);
f2.AllLocalFiles = FileIOPermissionAccess.PathDiscovery;
ps.AddPermission(f2);
var policy = PolicyLevel.CreateAppDomainLevel();
policy.RootCodeGroup.PolicyStatement = new PolicyStatement(ps);
AppDomain domain = AppDomain.CreateDomain("TestDomain", null,
new AppDomainSetup {
ApplicationBase = basePath,
});
domain.SetAppDomainPolicy(policy);