为什么 clr.AddReference 在第二个 IronPython 引擎上失败?

Why does clr.AddReference fail on second IronPython engine?

当我尝试添加对 IronPython 引擎实例的引用时,引用已按预期添加到引用中。如果我创建引擎的另一个实例,则 AddReference 执行时不会出错,但引用不会添加到引用中,导入语句失败并显示 "no module named ...".

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 是 Python 标准库的预编译 DLL,带有 pyc .

我也尝试使用来自 github 的自编译 IronPython 2.7.5 和 2.7.6,但是第一个 engine.execute 已经失败 "no module named pydoc" 尽管添加参考。

我是做错了什么还是只是一个错误?

一位同事找到了失败的原因。我 post 在这里,以防其他人偶然发现这个问题。

添加引用后需要加载程序集:

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