Pythonnet导入.NET嵌套程序集报错:无法加载依赖程序集
问题描述
代码仓库
所有代码可查看:github.com/avivs100/pythonnetTest
环境信息
- Pythonnet版本:3.0.3.0
- Python版本:3.11.3
- 操作系统:Win10
- .NET Runtime:7
问题详情
我创建了一个包含3个.NET7项目的解决方案:2个类库项目和1个控制台项目。其中davidProj是仅含一个带简单属性类的类库;consoleApp1通过System.Text.Json NuGet包创建David实例并保存为JSON文件;Test.Infrastructure.DavidUtils类库包含一个静态类及以下静态方法:
public static David DeserializeDavidFromJsonString(string davidJson) { //using the System.Text.Json nuget var david = JsonSerializer.Deserialize<David>(davidJson) ?? throw new Exception("error"); return david; }
运行.NET程序生成David实例的JSON文件后,我将相关.dll文件和JSON文件复制到新文件夹,在该文件夹中创建Python文件并安装Pythonnet,编写对应调用代码后出现以下问题:
- 调用含NuGet依赖的方法时,使用System.Text.Json会报错无法加载程序集'System.Memory, Version=7.0.0.0...';
- 使用Newtonsoft.Json则提示缺失其他依赖程序集。
调用无NuGet依赖的简单方法(如David类的构造函数、普通方法)均正常,仅含NuGet依赖的方法触发错误。
解决方案
1. 强制复制所有NuGet依赖到输出目录
.NET类库默认不会把NuGet依赖的程序集复制到输出目录,需要修改类库项目的.csproj文件,添加以下配置:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
重新构建项目后,输出目录会包含所有依赖的.dll文件,把这些文件全部复制到Python运行的文件夹中。
2. 配置Pythonnet的程序集搜索路径
在Python代码里,把当前工作目录添加到.NET的程序集搜索路径,确保能找到所有依赖:
import clr import sys # 将当前目录加入.NET程序集搜索路径 sys.path.append(".") # 加载你的类库 clr.AddReference("Test.Infrastructure.DavidUtils") clr.AddReference("davidProj") # 导入并调用方法 from Test.Infrastructure.DavidUtils import DavidUtils # 读取JSON文件内容 with open("david.json", "r") as f: json_content = f.read() david = DavidUtils.DeserializeDavidFromJsonString(json_content)
3. 发布自包含的.NET类库
如果上述方法无效,直接把Test.Infrastructure.DavidUtils类库发布为自包含部署:
- 打开项目属性的发布设置,选择自包含模式,目标运行时选
win-x64(匹配你的系统架构); - 发布完成后,把生成的所有文件复制到Python工作目录,这样.NET运行时会直接使用本地打包的依赖,不会出现缺失问题。
4. 解决版本冲突问题
如果仍然报版本错误,检查并显式指定依赖版本:
在.csproj文件中明确指定NuGet包的版本,确保和.NET 7兼容:
<PackageReference Include="System.Text.Json" Version="7.0.3" /> <PackageReference Include="System.Memory" Version="7.0.0" />
内容的提问来源于stack exchange,提问作者aviv shichman
相关产品推荐
相关产品推荐

