2009-09-01 25 views
6

我已經嘗試了很明顯的:如何在單獨的AppDomain中承載IronPython引擎?

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

但我收到以下錯誤信息:類型未解決的成員「Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting,版本= 0.9.0.0,文化=中立,PublicKeyToken = 31bf3856ad364e35'。

Google上搜尋這個錯誤並沒有被證明卓有成效的SOFAR ...

編輯#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

你能提供更多關於你如何編譯/運行的信息嗎? 當我將「test.cs」放入Program Files目錄並運行它時,這適用於2.0.2和2.6 Beta 2。你也運行在.NET 2.0/3.0/3.5或.NET 4上嗎? – 2009-09-01 18:15:29

+0

我會建議,它是流,你在這個應用程序域中創建,但讓機器運行在另一個應用程序域... – cRichter 2009-12-17 09:21:43

回答

2

只需創建自己的引導類,它將在新的AppDomain中運行,並會在那裏執行IronPyton的初始化,它會解決概率問題嗎?

+0

我能夠減少問題的東西 - 我想要傳入的對象IronPython運行時不是MarshalByRef,那就是問題... – 2009-12-22 07:30:19

相關問題