2016-04-27 55 views
0

當我嘗試添加對IronPython引擎實例的引用時,引用get按預期添加到引用。如果我創建了另一個引擎實例,則AddReference會執行而不會出現錯誤,但引用不會添加到引用中,並且導入語句會失敗,並顯示「no module named ...」。爲什麼clr.AddReference在第二個IronPython引擎上失敗?

var engine = Python.CreateEngine(); 
dynamic clr = engine.Runtime.GetClrModule(); 
clr.AddReference("IronPython.StdLib"); 
var references = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // ok 

var source = "import pydoc\npydoc.plain(pydoc.render_doc(str))"; 
var result = engine.Execute<string>(source); 
Debug.Assert(result.StartsWith("Python Library Documentation")); // ok 

var engine2 = Python.CreateEngine(); 
dynamic clr2 = engine2.Runtime.GetClrModule(); 
clr2.AddReference("IronPython.StdLib"); 
var references2 = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references2.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // fails 

result = engine.Execute<string>(source); // throws ImportException "no module named pydoc" 
Debug.Assert(result.StartsWith("Python Library Documentation")); 

我的IronPython 2.7.5的二進制釋放試圖(安裝到GAC)和C#4.5,IronPython.StdLib與PYC Python標準11b的預編譯DLL。

我也嘗試過使用github自編譯的IronPython 2.7.5和2.7.6,但第一個engine.execute已經失敗,並且,儘管引用被添加了。

我做錯了什麼,或者它只是一個錯誤?

回答

0

一位同事找到了失敗的原因。我在這裏發佈它,以防其他人在這個問題上絆倒。

您需要將基準後,加載程序集:

var engine = Python.CreateEngine(); 
dynamic clr = engine.Runtime.GetClrModule(); 
clr.AddReference("IronPython.StdLib"); 

// load assembly into engine 
var assembly = Assembly.LoadFrom("IronPython.StdLib.dll"); 
engine.Runtime.LoadAssembly(assembly); 

var references = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // ok 

var source = "import pydoc\npydoc.plain(pydoc.render_doc(str))"; 
var result = engine.Execute<string>(source); 
Debug.Assert(result.StartsWith("Python Library Documentation")); // ok 

var engine2 = Python.CreateEngine(); 
dynamic clr2 = engine2.Runtime.GetClrModule(); 
clr2.AddReference("IronPython.StdLib"); 

// load assembly into engine2 
engine2.Runtime.LoadAssembly(assembly); 

var references2 = (IEnumerable<Assembly>)clr.References; 
Debug.Assert(references2.Any(asm => asm.FullName.StartsWith("IronPython.StdLib"))); // does not fail 

result = engine.Execute<string>(source); // does not throw any more 
Debug.Assert(result.StartsWith("Python Library Documentation")); 
相關問題