2017-06-15 4 views
0

Ich finde keine aktuelle Syntax für das Einfügen einer Ironpython ScriptEngine in eine eigene AppDomain in C#.Ironpython ScriptEngine in der AppDomain-Syntax

Die einzige Syntax ich bisher gesehen habe, ist durch die Script Schaffung etwa so:

AppDomain sandbox = AppDomain.CreateDomain("sandbox"); 
ScriptEngine engine = Python.CreateEngine(sandbox); 

Dies funktioniert nicht, zumindest nicht in IPY 2.7.7, in der folgenden Ausnahme resultierende:

SerializationException: Could not find type 'System.Collections.Generic.IList`1[[Microsoft.Scripting.Hosting.LanguageSetup, Microsoft.Scripting, Version=1.1.2.22, Culture=neutral, PublicKeyToken=7f709c5b713576e1]]'. 
(wrapper xdomain-invoke) System.AppDomain:CreateInstanceAndUnwrap (string,string,bool,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[],System.Security.Policy.Evidence) 
(wrapper remoting-invoke-with-check) System.AppDomain:CreateInstanceAndUnwrap (string,string,bool,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[],System.Security.Policy.Evidence) 
Microsoft.Scripting.Hosting.ScriptRuntime.CreateRemote (System.AppDomain domain, Microsoft.Scripting.Hosting.ScriptRuntimeSetup setup) 
IronPython.Hosting.Python.CreateRuntime (System.AppDomain domain) 
IronPython.Hosting.Python.CreateEngine (System.AppDomain domain) 

ich habe auch versucht, den vollen Satz von Parametern zu geben, wie ich sie verstehe, wie hier zu sehen: seit dem sy

Aber http://answers.unity3d.com/questions/242901/problem-with-appdomainspermissionset-ironpython-in.html Der Befehl ntax zum Erstellen der Scriptengine mit der AppDomain, da der Parameter in 2.7.7 veraltet oder nicht verfügbar ist, führt zu demselben Fehler.

Außerdem muss ich ein Wörterbuch der Ironpython-Optionen wie "FullFrames" usw. hinzufügen, was Python.CreateEngine erwartet.

Ich muss Ironpython in seiner eigenen AppDomain, da es scheint, dass eine Art von Speicherverlust, Unity nach ein paar Assembly Lasten verursacht, oder mehrere Instanziierungen der Engine (die ich Null und Herunterfahren der Laufzeit und Müll sammeln, wenn die Hauptroutine in IPY beendet hat)

Hier ist, was ich mit so viel arbeite:

Dictionary<string, object> options = new Dictionary<string, object>(); 
options["Frames"] = true; 
options["FullFrames"] = true; 
options["LightweightScopes"] = true; 
options["ShowClrExceptions"] = true; 
options["ExceptionDetail"] = true; 

AppDomain sandbox = AppDomain.CreateDomain("sandbox"); 
// Don't know where to go from here to get my engine into the AppDomain. 

engine = Python.CreateEngine(options); 
scope = engine.CreateScope(); 

var paths = engine.GetSearchPaths(); 
paths.Add(@"C:\Python\IronPython2.7.7\Lib"); 
paths.Add(@"C:\Python\IronPython2.7.7\Lib\site-packages"); 
engine.SetSearchPaths(paths); 

scope.SetVariable("test", "12345"); 

try 
{ 
    source.Execute(scope); 
} 
catch (SystemExitException e) 
{ 
    Debug.Log("IronPython exited with the following code (" + e + ")"); 
} 
catch (Exception e) 
{ 
    ExceptionOperations eo = engine.GetService<ExceptionOperations>(); 
    string error = eo.FormatException(e); 
    Debug.Log("<color=red>IPYError : </color>" + error); 
} 

engine.Runtime.Shutdown(); 
engine = null; 
runtime = null; 
source = null; 
scope = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

Antwort

0

das Problem war, dass müssen Sie zuerst die Baugruppe für Microsoft.Scripting.Hosting laden in die appdomain mit allen abhängigen Assemblys wie MSCorLib.dll. Da die IronPython-ScriptEngine-Assembly in ihrer eigenen AppDomain sein soll, hat sie keinen Zugriff mehr auf Assemblys wie "System.Collections.Generic.IList". Nachdem ich dies tat, arbeitete diese Zeile:

engine = Python.CreateEngine(sandbox, options); 

Wie gut, es die Unity Abstürze fixiert, die Ironpython-Speicherleck enthält. Nachteil ist, dass Sie IronPython nicht benutzen können, um den Editor direkt zu manipulieren, ohne einige ausgefallene Berechtigungen/Hotswapping etc.

Zumindest keine Abstürze mehr, was ein Gott-Senden ist.

+0

Ich sollte hinzufügen, dass dies keine vollständige Lösung ist, da jetzt Umfang wird nicht funktionieren in IronPython ScriptEngine, und Vars zurück in die Hauptdomäne ohne ein MarshalByRef/Serialisierung Design-Muster. Etwas, das ich immer noch nicht herausgefunden habe. – karmakat

+0

Nein! Es klappt! Sie können sogar Unity GameObjects bearbeiten. Ich verwendete Folgendes beim Erstellen der AppDomain: 'PermissionSet permSet = new PermissionSet (PermissionState.Unrestricted); AppDomain sandbox = AppDomain.CreateDomain ("Sandbox", AppDomain.CurrentDomain.Evidence, info, permSet); ' – karmakat