我正在尝试为可以加载插件的地方创建一个沙箱。我创建了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 }}?