我想构建一个 WPF 系统,该系统可以包含由外部开发人员社区开发的插件。由于我不能为这些开发人员担保,我希望他们的代码在安全的环境中运行。看来 MAF 是一个很好的解决方案,所以我决定调查一下 MAF 的安全性。可以为每个插件定义一个精确的权限集,这非常好。
但是,我希望插件能够返回 WPF 控件。为此,他们需要能够运行 WPF 程序集。另外,我不希望插件能够运行非托管代码,这样它们就不能覆盖我在加载插件时设置的安全权限。
所以这就是问题所在 - 如果我在未经许可的情况下加载插件以运行非托管代码,那么插件将无法创建 WPF 控件。我怎么解决这个问题?
为了进一步测试这个问题,我编写了一个小型 WPF 应用程序,并尝试加载它并从第二个应用程序运行它。Bellow 是加载和运行 WPF 应用程序的代码。如果按原样,它会很好用,但是如果我删除最后一个 AddPermission 语句(带有 UnmanageCode 标志的语句),它就会停止工作,说它无法创建 WPF 应用程序的窗口。
PermissionSet set = new PermissionSet(PermissionState.None);
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(new UIPermission(PermissionState.Unrestricted));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
Evidence ev = new Evidence();
AppDomain domain = AppDomain.CreateDomain("Test", ev, new AppDomainSetup() { ApplicationBase = PATH }, set);
domain.ExecuteAssembly(PATH);