我已经尝试了明显的:
var appDomain = AppDomain.CreateDomain("New Domain");
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom!
但我收到以下错误消息:成员“Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting, Version=0.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的类型未解析。
到目前为止,谷歌搜索这个错误还没有被证明是富有成效的......
编辑#1:
我试图通过将相关内容复制到新的控制台应用程序来创建一个最小的复制项目:
using System;
using Microsoft.Scripting;
namespace PythonHostSamle
{
class Program
{
static void Main(string[] args)
{
AppDomain sandbox = AppDomain.CreateDomain("sandbox");
var engine = IronPython.Hosting.Python.CreateEngine(sandbox);
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\Python25\Lib");
searchPaths.Add(@"C:\RevitPythonShell");
engine.SetSearchPaths(searchPaths);
var scope = engine.CreateScope();
//scope.SetVariable("revit", _application);
//engine.Runtime.IO.SetOutput(new ScriptOutputStream(_instance), Encoding.UTF8);
//engine.Runtime.IO.SetErrorOutput(new ScriptOutputStream(_instance), Encoding.UTF8);
var script = engine.CreateScriptSourceFromString("print 'hello, world!'", SourceCodeKind.Statements);
script.Execute(scope);
Console.ReadKey();
}
}
}
这按预期工作!
因此,我可以得出结论,我得到的错误与我注释掉的一行有关:添加到引擎的范围包含一个我几乎无法控制的对象-对该软件旨在运行的插件主机的引用在(Autodesk Revit Architecture 2010)中。
也许试图通过那是造成错误的原因?
有没有办法通过代理来代替?(将不得不查找 .NET 远程处理...)
编辑#2:
我已将问题缩减为通过无法代理到另一个 AppDomain 的范围传递对象:添加到在不同 AppDomain 中运行的 IronPython 解释器范围的所有对象都必须以某种方式编组,因此必须扩展MarshalByRefObject
或是Serializable
。