2009-09-01 15 views
6

Próbowałem oczywiste:Jak hostować silnik IronPythona w oddzielnym AppDomain?

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

Ale ja otrzymuję następujący komunikat o błędzie: Type nie zostanie rozwiązany za członka „Microsoft.Scripting.Hosting.ScriptRuntimeSetup, Microsoft.Scripting, Version = 0.9.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 '.

Googling tego błędu nie okazała owocne sofar ...

EDIT # 1:

Próbowałem stworzyć minimalny projekt odtwarzający kopiując odpowiednie rzeczy do nowej aplikacji konsoli:

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(); 
     } 
    } 
} 

Działa to zgodnie z oczekiwaniami!

Pozostaje mi więc stwierdzić, że błąd, który otrzymuję, jest związany z jedną z linii, które skomentowałem:: Zakres dodany do silnika zawiera obiekt, nad którym mam niewielką kontrolę - odniesienie do hosta wtyczki to oprogramowanie jest przeznaczone do pracy w (Autodesk Revit Architecture 2010).

Może próba przekazania jest tym, co powoduje błąd?

Czy istnieje sposób przekazywania proxy zamiast? (Będą musieli patrzeć .NET usług zdalnych ...)

EDIT # 2:

Mam problem stopniała do przechodzącej przez obiekt zakresu, które nie mogą być zastępowanym do innego AppDomain: Wszystkie obiekty dodane do zakresu interpretera IronPython działającego w innej AppDomain będą musiały być jakoś zebrane i muszą w związku z tym rozszerzyć MarshalByRefObject lub być Serializable.

+0

Czy możesz podać więcej informacji o tym, jak się je kompiluje/uruchamia? To działa dla mnie przeciwko wersjom 2.0.2 i 2.6 Beta 2, kiedy umieszczam "test.cs" w katalogu Program Files i uruchamiam go. Również używasz .NET 2.0/3.0/3.5 lub .NET 4? –

+0

Sugeruję, że to strumienie, które tworzysz w tej domenie aplikacji, ale pozwól maszynie działać w innej domenie aplikacji ... – cRichter

Odpowiedz

2

Po prostu utwórz własną klasę ładowania, która będzie działać w nowej AppDomain i uruchomi tam IronPyton, czy rozwiąże problem?

+0

Udało mi się zredukować problem do czegoś innego - obiektów, które chciałem przekazać środowisko wykonawcze IronPython, w którym nie było MarshalByRef i na tym polegał problem ... –

Powiązane problemy