5

我在从 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' 的错误仍然出现。

4

2 回答 2

0

FileNotFoundException 表明某些东西正在使用 Assembly.LoadFile 而不是 Assembly.LoadFrom 加载程序集,但未正确处理程序集策略。我不确定 Visual Studio 中的 Python 代码是如何工作的,但如果您能够在加载可移植程序集之前运行任何引导程序代码,请尝试我在此处显示的代码: PCL Retargetable Assembly not redirected inside MS CRM Plugin

于 2013-08-02T16:06:19.993 回答
-1

使用 sys.path 将路径添加到您的 .net dll 所在的位置:

import sys
sys.path.append("c:\MyDotNetDir");

import clr
clr.AddReference("MyDotNetAssembly.dll")

# do not forget to import the namespace

import Erik.MyDotNetAssemblyNamespace

inst = Erik.MyDotNetAssemblyNamespace.MyDotNetObject()
于 2013-08-01T21:19:11.480 回答