c#SecurityException中的沙盒ironpython

c#SecurityException中的沙盒ironpython,c#,python,sandbox,C#,Python,Sandbox,好吧,这就是我所拥有的 private static AppDomain CreateSandbox() { var permissions = new PermissionSet(PermissionState.None); permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); permissions.AddPermission(new FileIOPermissi

好吧,这就是我所拥有的

private static AppDomain CreateSandbox()
{
  var permissions = new PermissionSet(PermissionState.None);
  permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

  permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read| FileIOPermissionAccess.PathDiscovery, AppDomain.CurrentDomain.BaseDirectory));
  var appinfo = new AppDomainSetup();
  appinfo.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;

  return AppDomain.CreateDomain("Scripting sandbox", null, appinfo, permissions, fullTrustAssembly);
}
当我尝试加载一些破损的python代码时

try
{
    var src = engine.CreateScriptSourceFromString(s.Python, SourceCodeKind.Statements);
    src.Execute(ActionsScope);
}
catch (Exception e)
{
    ExceptionOperations eo = engine.GetService<ExceptionOperations>();
    string error = eo.FormatException(e);
    Debug.WriteLine(error);
}

根据堆栈跟踪,代码中存在语法错误,因此Python运行时抛出
SyntaxErrorException
。该异常未被捕获,因此必须跨appdomain边界对其进行序列化


我认为现在的问题是
SyntaxErrorException
的方法
GetObjectData()
被标记为
[SecurityCritical]
,这意味着它只能由完全受信任的代码调用。

您可能需要尝试objecthandleexecuteandwrap(ScriptScope scope,out ObjectHandle exception)重载。当您刚刚捕获异常时,它会在抛出时从远程域封送到您的域,然后在调用FormatException时返回到远程域。看起来异常正在封送回您的应用程序域时发生


如果调用ExecuteAndRap重载,则只需获取结果和可能异常的句柄,并避免序列化-然后可以将句柄传回ExceptionOperations.FormatException。

什么是SecurityException?它的参数是什么?代码被破坏了,我要做的是捕获它抛出的实际IronPython异常。当我授予沙盒完全权限时,这就起作用了。正如你所知,我的代码中显然有语法错误。这就是我想要抓住的。不过,您的意思是,使用
[SecurityCritical]
属性,您必须拥有完全权限?我想是的。我不确定你是否能解决这个问题。但是我可能错了。是的,我似乎不能这样做,因为我不能指定我希望脚本加载的方式。你有一个语法示例来说明如何加载吗?我一直在到处找这个,但似乎找不到好的参考资料。