pythonnet调用VB.NET DLL遇导入错误及Python环境问题求助
问题描述
我电脑上安装了Python 3.8和3.12版本,分别在3.8解释器及3.12虚拟环境中安装了pythonnet 3.0.3(含clr-loader 0.2.6)。按照教程调用VB.NET编写的myDll.dll时遇到两类问题:
- Python 3.8环境下报错:
ImportError: cannot import name 'DllTest' from 'myDll' (unknown location),main.py与myDll.dll处于同一目录,已尝试多种路径格式添加引用但无效 - Python 3.12基础解释器下报错:
ModuleNotFoundError: No module named 'clr',尝试指定路径安装pythonnet时提示已安装在虚拟环境,基础环境仍无该包
已配置Python相关路径到系统变量,尝试多种安装方式仍未解决,请求帮助。
相关代码
main.py
import os import clr # myfile = open('C:/Users/k0330/OneDrive/Desktop/Kurse/WS 23 -24/Bachelorarbeit/Python/Project/callMyDll/myDll.dll') # clr.AddReference(myfile) #clr.AddReference("C:/Users/k0330/OneDrive/Desktop/Kurse/WS 23 -24/Bachelorarbeit/Python/Project/callMyDll/myDll.dll") clr.AddReference(r"C:\Users\k0330\OneDrive\Desktop\Kurse\WS 23 -24\Bachelorarbeit\Python\VS\callMyDll\myDll.dll") from myDll import DllTest dll = DllTest() dll.msgboxText() print(FindMax(7,9))
VB.NET代码
Public Class DllTest Public Sub msgboxText() MsgBox("Hello World!") End Sub Public Function FindMax(ByVal num1 As Integer, ByVal num2 As Integer) As Integer ' local variable declaration */ Dim result As Integer If (num1 > num2) Then result = num1 Else result = num2 End If FindMax = result End Function End Class
解决方案
针对Python 3.8的ImportError问题
- 核对DLL编译配置:
- 确保
myDll.dll是按VB.NET的**类库(Class Library)**模板编译的,目标框架推荐选.NET Framework 4.x(pythonnet对该框架支持更稳定) - 编译平台(x86/x64)必须与Python 3.8版本位数完全一致(比如Python是64位,DLL也要编译为64位)
- 确保
- 确认命名空间匹配:
你的VB.NET代码未显式声明命名空间,默认命名空间为项目名称。若VB.NET项目名称不是myDll,需修改导入语句为from 项目名称 import DllTest。可使用ILSpy工具查看DLL的实际命名空间和类名 - 简化引用方式:
将myDll.dll放在main.py同一目录,先把当前目录加入系统路径再添加引用:import sys import os import clr sys.path.append(os.path.dirname(os.path.abspath(__file__))) clr.AddReference("myDll") from myDll import DllTest - 调整pythonnet版本:
Python 3.8与pythonnet 3.0.3兼容性一般,可尝试降级到pythonnet 2.5.2,该版本对旧Python版本支持更稳定:pip install pythonnet==2.5.2
针对Python 3.12基础环境的clr模块缺失问题
- 指定基础环境安装:
打开命令提示符,切换到Python 3.12基础环境的Scripts目录(例如C:\Python312\Scripts),执行安装命令:
确保使用的是基础环境的pip install pythonnet==3.0.3pip,而非虚拟环境的pip - 验证安装结果:
打开Python 3.12基础环境的交互窗口,输入import clr,无报错则说明安装成功 - 调整环境变量优先级:
在系统Path中,将Python 3.12的安装路径移到虚拟环境路径之前,避免误调用虚拟环境的pip
内容的提问来源于stack exchange,提问作者user23139878
相关产品推荐
相关产品推荐

