【问题标题】:How to load portable .NET library within Iron Python script?如何在 Iron Python 脚本中加载可移植的 .NET 库?
【发布时间】:2013-05-08 14:03:27
【问题描述】:

我在从 Python 脚本加载可移植 .NET 库(用于标准 .NET 和 Silverlight 环境)时遇到严重问题。

.NET DLL 文件版本为 4.0.3.319.233 (System.Core.DLL),IronPython 为 2.7.1,运行在 32bit/x86 模式。 Visual Studio 2010 和 .NET 4 下的 C#。还安装了 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,版本=2.0.5.0,文化=中性,PublicKeyToken=7cec85d7bea7798e,可重定位=是”或其依赖项之一。系统找不到指定的文件。

最后一个代码似乎可以工作,当从另一个 .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' 的错误仍然出现。

【问题讨论】:

  • 您找到解决此问题的方法了吗?我现在面临这个问题 2 天,但我无法让它工作。

标签: python .net portable-class-library


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 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()
    

    【讨论】:

    • 虽然 FileNotFoundException 似乎缺少程序集,但可移植库引用被视为特殊处理,此异常表明有人错误地加载了我们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2011-03-02
    相关资源
    最近更新 更多