You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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问题

  1. 核对DLL编译配置:
    • 确保myDll.dll是按VB.NET的**类库(Class Library)**模板编译的,目标框架推荐选.NET Framework 4.x(pythonnet对该框架支持更稳定)
    • 编译平台(x86/x64)必须与Python 3.8版本位数完全一致(比如Python是64位,DLL也要编译为64位)
  2. 确认命名空间匹配:
    你的VB.NET代码未显式声明命名空间,默认命名空间为项目名称。若VB.NET项目名称不是myDll,需修改导入语句为from 项目名称 import DllTest。可使用ILSpy工具查看DLL的实际命名空间和类名
  3. 简化引用方式:
    将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
    
  4. 调整pythonnet版本:
    Python 3.8与pythonnet 3.0.3兼容性一般,可尝试降级到pythonnet 2.5.2,该版本对旧Python版本支持更稳定:
    pip install pythonnet==2.5.2
    

针对Python 3.12基础环境的clr模块缺失问题

  1. 指定基础环境安装:
    打开命令提示符,切换到Python 3.12基础环境的Scripts目录(例如C:\Python312\Scripts),执行安装命令:
    pip install pythonnet==3.0.3
    
    确保使用的是基础环境的pip,而非虚拟环境的pip
  2. 验证安装结果:
    打开Python 3.12基础环境的交互窗口,输入import clr,无报错则说明安装成功
  3. 调整环境变量优先级:
    在系统Path中,将Python 3.12的安装路径移到虚拟环境路径之前,避免误调用虚拟环境的pip

内容的提问来源于stack exchange,提问作者user23139878

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:04:59