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

Posted

技术标签:

【中文标题】如何在单独的 AppDomain 中托管 IronPython 引擎?【英文标题】:How to host an IronPython engine in a separate AppDomain? 【发布时间】:2009-09-01 14:17:52 【问题描述】:

我已经尝试了明显的:

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

但我收到以下错误消息:Type is notsolved for member '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

【问题讨论】:

你能提供更多关于你如何编译/运行它的信息吗?当我将“test.cs”放在 Program Files 目录中并运行它时,这对我适用于 2.0.2 和 2.6 Beta 2。您还在针对 .NET 2.0/3.0/3.5 或 .NET 4 运行吗? 我建议您在此应用程序域中创建流,但让机器在另一个应用程序域中运行... 【参考方案1】:

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

【讨论】:

我能够将问题简化为其他问题 - 我想传递到 IronPython 运行时的对象不是 MarshalByRef,这就是问题所在......

以上是关于如何在单独的 AppDomain 中托管 IronPython 引擎?的主要内容,如果未能解决你的问题,请参考以下文章

在默认 AppDomain 中的 Winforms 中托管 WPF 用户控件的弹出窗口中的选项卡导航损坏

C#、MAF、单独 AppDomain 中的未处理异常管理

将程序集加载到单独的 AppDomain 中,得到 InvalidCastException

将 DLL 加载到单独的 AppDomain

是否可以从另一个单独的 .NET AppDomain 更改 .NET AppDomain 中的字符串属性的值

如果我将两个应用程序加载到同一个 AppDomain 中,我可以与另一个托管应用程序交互吗?