2

我正在尝试创建一个可以加载插件的沙箱。我为我的主机程序集创建AppDomain并指定了一个StrongName,我的理解是,在程序集中运行的任何强命名的代码都在完全信任下运行。然而,情况似乎并非如此。

例子,

static void Main(string[] args)
{
    var permissions = new PermissionSet(PermissionState.None);
    var setup = new AppDomainSetup()
        {
            ApplicationBase = "C:\\Temporary\\Sandbox"
        };

    var domain = AppDomain.CreateDomain("Sandbox",
                                        null,
                                        setup,
                                        permissions,
                                        typeof (PluginHost).Assembly.Evidence.GetHostEvidence<StrongName>());

    var handle = Activator.CreateInstanceFrom(domain,
                                                typeof (PluginHost).Assembly.ManifestModule.FullyQualifiedName,
                                                typeof (PluginHost).FullName);

    var host = (PluginHost) handle.Unwrap();
    host.RunPlugin();
}

PluginHost(在同一个程序集中定义,我是强命名),

public class PluginHost : MarshalByRefObject
{
    public void RunPlugin()
    {
        File.ReadAllText("C:\\Passwords.txt");

        var asm = Assembly.LoadFile(@"C:\Plugins\UnsafePlugin.dll");
        var t = asm.GetType("UnsafePlugin.FooPlugin");

        object plugin = Activator.CreateInstance(t);
        plugin.GetType().GetMethod("Run").Invoke(plugin, null);
    }
}

这是插件(位于外部程序集中)

public class FooPlugin
{
    public void Run()
    {
        File.ReadAllText("C:\\Passwords.txt");
    }
}

我强烈命名包含的程序集PluginHost,因此我希望能够从而PluginHost不是从读取我的密码文件,FooPlugin但是在读取文件时代码会抛出 a SecurityException(in PluginHost)。

我从有关该主题的 MSDN 文档中的理解是,包含 StrongName-instances 的第四个参数将使这些程序集完全信任应用程序域。

从文档中:

“一组强名称表示在新应用程序域中被视为完全受信任的程序集。”

既然我刚刚证明自己错了——我应该如何让它发挥作用?为什么即使我已经传递给我,我也不完全StrongName信任AppDomain.Create

4

0 回答 0