У меня есть сниппет кода, который компилирует скрипт с помощью скриптового движка, и я получаю сборку в виде массива байтов.
Теперь я хочу загрузить эту сборку
в Sandbox, вот что у меня получилось:
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
.
Вышеописанное компилируется и запускается, но проблема в том, что код, который выполняется в доменной сборке, на самом деле не выполняется в песочнице. Когда я получаю метод submission-method, вызываю в нем фабрику и возвращаю этот AppDomain.CurrentDomain.FriendlyName
, результат таков: MyRoslynApplication.vshost.exe
что не песочница AppDomain
Я неправильно загружаю байт[]
-сборку?