了解AppDomains和强大的命名

时间:2013-05-21 15:55:26

标签: c# appdomain

我正在尝试为可以加载插件的地方创建一个沙箱。我创建了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读取我的密码文件,但代码会抛出SecurityException在阅读文件时(PluginHost)。

我对MSDN documentation on the subject的理解是,包含StrongName-instances的第四个参数将使这些程序集在应用程序域中完全信任。

来自文档:

  

“表示要考虑的程序集的强名称数组   完全信任新的应用领域。“

因为我只是证明自己错了 - 我该如何才能让它发挥作用?为什么即使我已将StrongName传递给{{1 }}?

0 个答案:

没有答案