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
.
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? –
Sugeruję, że to strumienie, które tworzysz w tej domenie aplikacji, ale pozwól maszynie działać w innej domenie aplikacji ... – cRichter