我正在尝试创建一个可以加载插件的沙箱。我为我的主机程序集创建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
?