スクリプト エンジンでスクリプトをコンパイルするコード スニペットがあり、アセンブリをバイト配列として取得します。
これをサンドボックスにロードしたいのですが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[]
アセンブリを間違ってロードしていますか?