You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动