Python调用C#加载.NET依赖失败 方法访问TypeLoadException报错
PythonNet调用自定义DLL持续抛出TypeLoadException异常
环境信息
- Pythonnet版本:3.0.0a2 PRE-RELEASE
- Python版本:3.10.5
- 操作系统:Windows 10
- 已安装.NET运行时:.NET Core 6.0、.NET Core 5.0
问题描述
开发包含三类功能的C#类库,通过PythonNet的CLR导入DLL调用方法,实现功能如下:
- 两数相加
- 从文件读取XML
- Base64编码转换
不同环境下测试结果差异极大:
.NET Core 6.0环境
- 两数相加功能运行正常
- 读取XML、Base64编码转换功能抛出异常
- 异常详情:
System.TypeLoadException: Could not load type 'System.Text.Encoding' from assembly 'System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. - 异常触发位置:
DllExport.XMLReader(String filePath)
.NET Core 5.0环境
- 两数相加功能运行正常
- 读取XML功能运行正常
- Base64编码转换功能抛出异常
- 异常详情:
System.TypeLoadException: Could not load type 'System.Convert' from assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. - 异常触发位置:
ReusableLibariesConsole.Program.Base64_Encode(Byte[] data)
目标框架设置为.NET 2.0时
- 前述三个基础功能全部运行正常,但后续加密方法调用失败
- 异常详情:
System.TypeLoadException: Could not load type 'System.Security.Cryptography.PasswordDeriveBytes' from assembly 'System.Security.Cryptography.Csp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. - 异常触发位置:
DllExport.EncryptionManagerClass.Encrypt(String inputData, String password, Int32 bits)
已尝试修改CPU架构为x64、调整项目目标框架等方案,问题均未解决。
解决方法
所有报错的核心原因是程序集版本不匹配:异常信息里反复出现的Version=4.0.0.0是.NET Framework 4.x系列的核心程序集版本号,和.NET Core/.NET 5+的运行时不兼容。当前使用的3.0.0a2是PythonNet的预览版本,默认运行时加载逻辑存在缺陷,会错误匹配不同版本的基础类库,导致类型加载失败。
按以下步骤操作即可修复:
- 替换PythonNet版本:卸载当前的预览版,安装正式稳定版
pip uninstall pythonnet pip install pythonnet==3.0.1 - 显式指定.NET运行时:在Python代码最顶部、导入clr之前,明确指定要加载的运行时类型,禁止PythonNet自动选择
from pythonnet import load # 调用.NET 5/6编译的DLL用这行 load("coreclr") # 调用.NET Framework 2.0/4.x编译的DLL就替换为load("netfx") import clr # 后续添加DLL引用、调用方法的逻辑保持原有写法即可 - 统一C#项目编译目标:所有类库、依赖项目不要跨大版本编译,全部统一设置为同一个目标框架(例如全部设置为
net6.0-windows)后重新生成DLL,不要混用.NET Framework、.NET Core 3.1、.NET 5/6的编译产物。 - 加密功能兼容处理:如果统一为.NET 6编译后仍出现加密相关类型加载错误,给对应C#项目手动安装NuGet包
System.Security.Cryptography.Csp后重新编译即可——PasswordDeriveBytes类在.NET Core/.NET 5+中不属于默认核心运行时内容,需要单独引用对应包。
内容的提问来源于stack exchange,提问作者Naga
相关产品推荐
相关产品推荐

