我在从 Python 脚本加载可移植 .NET 库(用于标准 .NET 和 Silverlight 环境)时遇到严重问题。
.NET DLL 文件版本为 4.0.3.319.233 (System.Core.DLL),IronPython 为 2.7.1,运行在 32bit/x86 模式。.NET 4 下带有 C# 的 Visual Studio 2010。还安装了用于便携式库使用的 Microsoft .NET 更新 KB2468871(版本 2)。
如果我尝试从 Python 脚本加载库:
clr.AddReferenceToFileAndPath(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll")
它不能被访问,当脚本到达一个类型时,它说: “'namespace#'的属性[便携式程序集中的类型]是只读的” ,表明程序集根本没有被加载(或作为Silverlight,并且不能被 Python 脚本使用)。
将代码更改为:(来自 System.Reflection 的程序集类)
PortableAssembly = Assembly.LoadFrom(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll") # load through .NET Reflection, Python won't load Portable assembly properly!
clr.AddReference(PortableAssembly)
导致错误: 出现 exceptions.IOError 消息:[Errno 2] 无法加载文件或程序集 'System.Core,Version=2.0.5.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e,Retargetable=Yes'或其依赖项之一。该系统找不到指定的文件。
最后一个代码似乎可以工作,当从另一个 .NET 程序中自动调用 Python 脚本时,实例化它自己的 Python 引擎,但是当从 Visual Studio 中的 Python 项目执行脚本时会出现上述错误。VisualStudio 中的 Python 设置,Tools\Options\Python Tools\Interpreter Options 适用于 x86/32 位模式。所有环境参数都显示使用了 .NET 4。
我现在有多种方法可以从 C#/.NET 生成的 Python 引擎修复它,但是如何在基本 IronPython 运行时环境中加载可移植程序集,以便它在正确的 .NET 4 环境中工作,而不是试图加载任何 .NET 2 的东西?
更新:在 MS KB2468871 更新后,我重新启动并重建了我的便携式库,并且还卸载了 VS 的 IronPython 和 Python 工具,将它们替换为 2.7.3 和 1.5 版本(VS2010)。'System.Core, Version=2.0.5.0' 的错误仍然出现。