Загрузка скомпилированной сборки Roslyn в песочницу AppDomain

У меня есть сниппет кода, который компилирует скрипт с помощью скриптового движка, и я получаю сборку в виде массива байтов.

Теперь я хочу загрузить эту сборку в 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

Я неправильно загружаю байт[]-сборку?

7
задан Filip Ekberg 29 November 2011 в 15:02
поделиться