Python 2.7(SharpDevelop4.4)通过CLR加载.Net程序集报IOException问题
问题:IronPython通过CLR加载.Net 4程序集抛出System.IO.IOException
- 运行环境:Python 2.7(IronPython)、SharpDevelop 4.4
- 测试场景:通过
clr.AddReference()加载适配.Net Framework 4版本的Newtonsoft.Json.dll - 异常表现:控制台可正常识别clr模块,但运行代码时抛出
System.IO.IOException - 已尝试操作:
- 移除文件夹路径中的空格,问题仍然复现
- 在IDE中直接添加dll引用,无任何效果
- 核心诉求:后续需要批量加载多个C#程序集,确认是否缺失必要配置
解决方案
1. 优先修复CLR运行时版本不匹配问题
SharpDevelop 4.4默认搭载的IronPython运行时基于.Net 2.0/3.5生成,默认不会加载.Net 4程序集,这是触发加载IO异常的核心原因,和路径空格无关。
在项目输出目录下,找到和启动程序同名的.exe.config配置文件(没有就手动新建,比如启动文件为TestApp.exe则配置文件名为TestApp.exe.config),写入以下配置强制启用.Net 4运行时兼容:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
配置中useLegacyV2RuntimeActivationPolicy="true"必须开启,否则旧版本混合模式程序集仍然无法加载。
2. 显式指定程序集搜索路径
不要依赖默认相对路径做隐式加载,在调用加载方法前,手动把dll存放目录加入IronPython的搜索路径,避免路径解析错误:
import clr import sys import os # 替换为dll存放的实际绝对路径,示例为当前执行目录下的libs文件夹 assembly_dir = os.path.realpath("./libs") if assembly_dir not in sys.path: sys.path.append(assembly_dir) # 加载时优先填写程序集名称,不带.dll后缀 clr.AddReference("Newtonsoft.Json")
注意:SharpDevelop中IronPython项目的引用管理器不生效,不需要在IDE里手动加dll引用,所有CLR程序集都通过上述代码方式加载即可。
3. 多程序集加载排查技巧
后续加载多个程序集时如果遇到同类错误,可以先加全局程序集解析监听,直接输出加载失败的具体程序集名称,不用盲查配置:
import System def on_assembly_resolve(sender, args): print("缺失依赖程序集:%s" % args.Name) return None System.AppDomain.CurrentDomain.AssemblyResolve += on_assembly_resolve
如果提示加载的程序集有非托管依赖,需要把对应的原生dll一并放到之前配置的assembly_dir目录下,和托管dll放在同级目录即可正常加载。
内容的提问来源于stack exchange,提问作者Geoffrey Gaudi
相关产品推荐
相关产品推荐

