使用pythonnet调用自定义.NET代码时遭遇ImportError问题求助
解决pythonnet导入.NET程序集时的ImportError问题
我看了你的问题,你已经正确编译了.NET Framework 4.7.2的程序集,pythonnet也能找到、添加引用,但就是无法导入命名空间里的类——这个问题其实挺常见,主要和pythonnet加载程序集的方式以及环境兼容性有关,下面给你几个可行的解决方案:
1. 确保Python与.NET程序集的架构完全一致
先检查你的Python是x86还是x64版本,然后对应修改C#项目的编译平台:
- 右键C#项目 → 属性 → 生成 → 平台目标,选择和Python一致的架构(比如x64)
- 重新编译项目,生成对应架构的dll
如果Python是x64,而.NET程序集编译成x86(或者Any CPU在某些环境下默认跑成x86),就会导致类型无法被正确加载解析。
2. 使用绝对路径直接加载程序集
把你代码里的clr.AddReference("TestPyCS")替换成clr.AddReferenceToFileAndPath,直接指定dll的绝对路径,跳过程序集名称的查找逻辑,避免路径或缓存导致的问题。修改后的代码片段:
import clr import os import sys abshere = os.path.dirname(os.path.abspath(__file__)) dll_path = os.path.join(abshere, "TestPyCS", "TestPyCS", "bin", "Debug", "TestPyCS.dll") # 直接加载指定路径的dll clr.AddReferenceToFileAndPath(dll_path) # 测试System模块确认pythonnet正常 from System import Console Console.WriteLine("Hello world!") # 导入命名空间和类 import TestPyCS print(dir(TestPyCS)) from TestPyCS import TestCS t = TestCS() print(t.Test())
3. 针对pythonnet 3.x+配置运行时(可选)
如果你用的是pythonnet 3.x及以上版本,可以尝试在代码开头添加以下配置,强制指定.NET Framework运行时环境:
import clr clr.AddReference("System.Runtime") clr.AddReference("System.Runtime.InteropServices")
也可以尝试用System.Reflection.Assembly手动加载程序集后再导入:
from System.Reflection import Assembly Assembly.LoadFrom(dll_path)
问题根源说明
你看到dir(TestPyCS)只显示模块默认属性,说明pythonnet虽然创建了对应的模块对象,但没有加载到程序集里的类型——大概率是程序集加载上下文不对,或者架构不匹配导致类型无法被解析。
内容的提问来源于stack exchange,提问作者Daniele




