You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调用方法,实现功能如下:

  1. 两数相加
  2. 从文件读取XML
  3. 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的预览版本,默认运行时加载逻辑存在缺陷,会错误匹配不同版本的基础类库,导致类型加载失败。

按以下步骤操作即可修复:

  1. 替换PythonNet版本:卸载当前的预览版,安装正式稳定版
    pip uninstall pythonnet
    pip install pythonnet==3.0.1
    
  2. 显式指定.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引用、调用方法的逻辑保持原有写法即可
    
  3. 统一C#项目编译目标:所有类库、依赖项目不要跨大版本编译,全部统一设置为同一个目标框架(例如全部设置为net6.0-windows)后重新生成DLL,不要混用.NET Framework、.NET Core 3.1、.NET 5/6的编译产物。
  4. 加密功能兼容处理:如果统一为.NET 6编译后仍出现加密相关类型加载错误,给对应C#项目手动安装NuGet包System.Security.Cryptography.Csp后重新编译即可——PasswordDeriveBytes类在.NET Core/.NET 5+中不属于默认核心运行时内容,需要单独引用对应包。

内容的提问来源于stack exchange,提问作者Naga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:09:16