如何在单独的AppDomain中托管IronPython引擎?
我试过了明显的事:
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’的类型未解析。
谷歌搜索这个错误并没有certificate是富有成效的…
编辑#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:Python25Lib"); 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
。
只需创建自己的bootstrapping类,它将在新的AppDomain中运行,并在那里进行IronPyton的初始化,它会解决问题吗?
上述就是C#学习教程:如何在单独的AppDomain中托管IronPython引擎?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1281699.html