如何在单独的AppDomain中托管IronPython引擎?

Dar*_*mas 6 .net c# ironpython appdomain

我试过了明显的事:

var appDomain = AppDomain.CreateDomain("New Domain");
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom!
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误消息:成员'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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作!

因此,我得出的结论是,我得到的错误与我注释掉的一行有关:添加到引擎的作用域包含一个我无法控制的对象 - 对该插件主机的引用此软件旨在运行在(Autodesk Revit Architecture 2010)中.

也许试图传递这是创造错误的原因?

有没有办法传递代理?(将不得不查找.NET远程...)

编辑#2:

我已经将问题归结为通过无法代理到其他AppDomain的作用域传递对象:添加到在不同AppDomain中运行的IronPython解释器范围的所有对象都必须以某种方式进行封送,因此必须扩展MarshalByRefObject或是Serializable.

小智 2

只需创建您自己的引导类,该类将在新的 AppDomain 中运行,并在那里进行 IronPyton 的初始化,它能解决问题吗?