我有一个使用脚本引擎编译脚本的代码片段,我将程序集作为字节数组检索。
现在我想将它加载到Assembly
沙盒中,这就是我所拥有的:
Assembly _dynamicAssembly;
ScriptEngine _engine;
Session _session;
public string Execute(string code)
{
// Setup sandbox
var e = new Evidence();
e.AddHostEvidence(new Zone(SecurityZone.Internet));
var ps = SecurityManager.GetStandardSandbox(e);
var setup = new AppDomainSetup
{ ApplicationBase = Environment.CurrentDirectory };
var domain =
AppDomain.CreateDomain("Sandbox",
AppDomain.CurrentDomain.Evidence, setup, ps);
AppDomain.CurrentDomain.AssemblyResolve += DomainAssemblyResolve;
// Process code
var submission = _engine.CompileSubmission<object>(code, _session);
submission.Compilation.Emit(memoryStream);
var assembly = memoryStream.ToArray();
_dynamicAssembly = Assembly.Load(assembly);
var loaded = domain.Load(assembly);
// Rest of the code...
}
这是 AssemblyResolve 的事件处理程序:
Assembly DomainAssemblyResolve(object sender, ResolveEventArgs args)
{
return _dynamicAssembly;
}
这意味着当我这样做时,domain.Load(assembly)
我将获得 _dynamicAssembly,如果我不订阅该事件并返回该事件Assembly
,我将获得一个FileNotFoundException
.
以上编译运行,但问题是在域程序集中执行的代码实际上并没有在沙箱中执行。当我得到提交方法并在其中调用工厂并返回AppDomain.CurrentDomain.FriendlyName
结果是:MyRoslynApplication.vshost.exe
这不是沙箱AppDomain
我加载我的byte[]
-assembly 错误吗?