对于当前有效的程序集,CreateInstanceAndUnwrap会抛出TypeLoadException

时间:2017-09-17 15:51:01

标签: c# .net mono .net-assembly

我正在尝试使用新的应用程序域在更加孤立/受限制的设置中加载应用程序插件/ 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);

0 个答案:

没有答案