2017-06-15 69 views
0

我找不到最新的Ironpython ScriptEngine在C#中它自己的AppDomain中的語法。AppDomain語法中的Ironpython ScriptEngine

到目前爲止,我所看到的唯一的語法是通過創建的ScriptEngine像這樣:

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

這是不行的,至少不會在IPY 2.7.7,導致以下異常:

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) 

我也試圖讓整套參數,我理解他們是在這裏看到: http://answers.unity3d.com/questions/242901/problem-with-appdomainspermissionset-ironpython-in.html

但由於SY因爲它的參數在AppDomain中創建Scriptengine的ntax在2.7.7中被棄用或不可用,所以會導致相同的錯誤。

另外,我需要添加一個像「FullFrames」等Ironpython選項的字典,這是Python.CreateEngine期望的。

我需要把Ironpython放在它自己的AppDomain中,因爲在一些程序集加載後,或者在引擎的多個實例化之後,我似乎會出現某種導致Unity崩潰的內存泄漏(我將其刪除並關閉運行時和垃圾收集時,主程序IPY已完成)

以下是我與迄今爲止的工作:

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

回答

0

的問題是,你必須首先加載Microsoft.Scripting.Hosting大會進入appdomain,以及它的所有依賴程序集,如MSCorLib.dll。由於IronPython ScriptEngine程序集旨在位於其自己的AppDomain中,因此不再有權訪問諸如「System.Collections.Generic.IList」之類的程序集。一旦我這樣做,這條線的工作:

engine = Python.CreateEngine(sandbox, options); 

同時,它解決了統一崩潰,含IronPython的內存泄漏。缺點是你將無法直接使用IronPython來操作編輯器,缺少一些奇特的權限/ Hotswapping等。

至少沒有崩潰,這是一個神的發送。

+0

我應該補充一點,這不是一個完整的解決方案,因爲現在範圍將無法在IronPython ScriptEngine中使用,並且在沒有MarshalByRef/Serialization設計模式的情況下將變量返回到主域。我仍然沒有想到的東西。 – karmakat

+0

不!有用!你甚至可以操作Unity GameObjects。我創建AppDomain時使用了以下內容: 'PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted); AppDomain sandbox = AppDomain.CreateDomain(「sandbox」,AppDomain.CurrentDomain.Evidence,info,permSet);' – karmakat