2013-05-08 71 views
5

我从Python脚本加载可移植的.NET库(用于标准的.NET和Silverlight环境)存在严重的麻烦。如何在Iron Python脚本中加载可移植的.NET库?

.NET DLL文件版本是4.0.3.319.233(System.Core.DLL),IronPython是2.7.1,运行在32位/ x86模式下。 Visual Studio 2010与.NET 4下的C#。还安装了用于便携式库使用的Microsoft .NET更新KB2468871(版本2)。

如果我试图从Python脚本加载库:

clr.AddReferenceToFileAndPath(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll") 

它不能被访问,当脚本达到一个类型,它说: “属性[类型便携式组件]'namespace#'是只读的“ ”表示程序集尚未加载(或作为Silverlight,并且不能由Python脚本使用)。

代码更改为:(来自的System.Reflection Assembly类)

PortableAssembly = Assembly.LoadFrom(UsedPath+"\\MyNamespace\\MyPortableLibrary.dll") # load through .NET Reflection, Python won't load Portable assembly properly! 
clr.AddReference(PortableAssembly) 

导致错误: exceptions.IOError发生 消息:[错误2]无法加载文件或程序集“系统.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选项适用于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'的错误仍然存​​在。

+0

您是否找到了解决此问题的解决方案?我现在面对这个问题已经有2天了,而且我无法完成它的工作。 – 2015-06-22 06:39:24

回答

-1

使用sys.path中添加pathes到您的.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() 
+0

尽管FileNotFoundException似乎缺少程序集,但可移植库引用被视为特殊的,并且此异常表明某人正在加载不正确。 – 2013-08-02 16:02:18

0

的FileNotFoundException异常是一个迹象表明事情正在使用的,而不是Assembly.LoadFrom Assembly.LoadFile加载组件,但不处理组装策略正确。我不确定Visual Studio中的Python代码是如何工作的,但是如果您能够在便携式程序集加载之前运行任何引导程序代码,请尝试下面显示的代码: PCL Retargetable Assembly not redirected inside MS CRM Plugin