在PyCharm中用Pythonnet调用C# DLL时遇System.IO.FileNotFoundException
问题重现
调用代码
from pythonnet import load load("coreclr") import platform print(platform.architecture()) import clr from System import * from Microsoft import * clr.AddReference("dll/dllname2") from dllname import classname var1 = String("test") var2 = String("test") obj: object = Class() msg =(obj.MethodName(String(""),String("")))
抛出异常
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
File name: 'Microsoft.Extensions.Configuration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
解决方案
确保依赖DLL存在并可访问
目标C# DLL依赖Microsoft.Extensions.Configuration 7.0.0.0,需将该DLL及同版本的相关依赖(如Microsoft.Extensions.Configuration.Abstractions)放置到Python脚本可读取的路径:- 可放在Python脚本同级目录,或你添加引用的
dll文件夹下; - 从NuGet下载对应版本的包,解压后提取
lib/net7.0目录下的相关DLL。
- 可放在Python脚本同级目录,或你添加引用的
匹配.NET Runtime版本
你使用load("coreclr")加载.NET Core运行时,需确保其版本与C# DLL编译时依赖的.NET版本一致(此处为.NET 7):- 通过设置环境变量
DOTNET_ROOT指定.NET 7 runtime的安装路径; - 在PyCharm的运行配置中添加该环境变量。
- 通过设置环境变量
显式添加依赖引用
在代码中除了引用目标DLL,还要显式添加缺失的依赖项引用:# 替换为实际的DLL路径 clr.AddReference("path/to/Microsoft.Extensions.Configuration")版本绑定重定向(可选)
若无法找到精确的7.0.0.0版本,可在Python脚本同级目录创建runtimeconfig.json文件,指定版本绑定规则:{ "runtimeOptions": { "assemblyBinding": { "dependencies": [ { "name": "Microsoft.Extensions.Configuration", "publicKeyToken": "adb9793829ddae60", "version": "7.0.0.0", "culture": "neutral" } ] } } }
内容的提问来源于stack exchange,提问作者Saurabh

