使用pythonnet调用Windows目标.NET DLL遇导入错误求助
解决pythonnet调用Windows特定.NET 9框架库时的ModuleNotFoundError问题
可能的原因及解决步骤
1. 检查C#库的输出结构
当目标框架切换为net9.0-windows10.0.17763时,编译后的DLL会被放在Windows平台特定的子目录中(例如bin/Debug/net9.0-windows10.0.17763/win-x64),而非net9.0的根目录。需确保Python代码中添加的dll_path指向DLL实际所在的目录,而非项目父目录。
2. 直接指定DLL完整路径加载
跳过程序集名称查找逻辑,直接用绝对路径加载DLL,避免名称解析失败:
import sys import clr # 替换为实际的DLL绝对路径 dll_full_path = r"/path/to/actual/dll/location/PyCsLib.dll" clr.AddReference(dll_full_path) from PyCsLib import TestClass
3. 确认pythonnet与.NET运行时兼容性
- 确保Python环境运行在Windows系统上(目标框架为Windows专属,无法跨平台加载)
- 升级pythonnet到最新稳定版:执行
pip install --upgrade pythonnet,3.0+版本已支持.NET 5及以上框架 - 安装对应版本的**.NET 9 Windows Desktop Runtime**,而非仅基础.NET 9 Runtime
4. 验证程序集加载状态
添加调试代码确认PyCsLib是否被正确加载:
import sys import clr from System import Reflection dll_path = r"/path/to/dll/folder" sys.path.append(dll_path) clr.AddReference("PyCsLib") # 打印所有已加载的引用程序集名称 for asm in Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies(): print(asm.Name)
如果输出中没有PyCsLib,说明程序集未被正确识别,需重新检查路径或DLL文件完整性。
5. 检查C#代码的可见性
确保PyCsLib命名空间和TestClass都添加了public修饰符,避免因访问权限导致无法被pythonnet识别。
内容的提问来源于stack exchange,提问作者tm.crz
相关产品推荐
相关产品推荐

