我尝试了显而易见的事实:
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'。< / em>的
谷歌搜索这个错误并没有证明是富有成效的... ...
编辑#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
。
答案 0 :(得分:2)
只需创建自己的bootstrapping类,它将在新的AppDomain中运行,并在那里进行IronPyton的初始化,它会解决问题吗?