使用Python.NET在.NET Framework 4.8中调用Python 3.11时遇DLL加载失败问题
问题分析与解决方案
核心原因
错误中的Win32Exception: %1 不是有效的 Win32 应用程序明确指向进程位数与Python DLL位数不匹配:你的.NET项目以AnyCPU模式编译,在部分环境下会以32位进程运行,但你安装的Python 3.11是64位版本(反之亦然),导致无法加载对应位数的python311.dll。
解决步骤
1. 确认Python的位数
打开Python终端,执行以下代码:
import sys print(sys.maxsize > 2**32)
- 输出
True:Python是64位版本 - 输出
False:Python是32位版本
2. 修改.NET项目的编译平台
右键你的.NET Framework 4.8项目 → 属性 → 生成:
- 将“平台目标”从
AnyCPU改为与Python位数一致的选项(x64或x86) - 取消勾选“首选32位”(如果有该选项)
3. 修正代码中的初始化逻辑
你的代码缺少Python.NET必需的初始化调用,修正后的代码示例:
static void Main(string[] args) { string pathToPython = @"C:\Users\John\AppData\Local\Programs\Python\Python311"; string path = pathToPython + ";" + Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONHOME", pathToPython, EnvironmentVariableTarget.Process); var lib = new[] { @"C:\code\python scripts", @"C:\code\python scripts\.venv\Lib\site-packages", @"C:\code\python scripts\Lib", @"C:\code\python scripts\Lib\site-packages", }; string paths = string.Join(";", lib); Environment.SetEnvironmentVariable("PYTHONPATH", paths, EnvironmentVariableTarget.Process); Runtime.PythonDLL = @"C:\Users\John\AppData\Local\Programs\Python\Python311\python311.dll"; try { PythonEngine.Initialize(); // 必须添加的初始化步骤 using (Py.GIL()) { // 示例Python调用 dynamic sys = Py.Import("sys"); Console.WriteLine(sys.version); // 你的业务逻辑代码 } } finally { PythonEngine.Shutdown(); // 程序结束时关闭Python引擎 } }
4. 额外验证
- 确认
python311.dll的路径真实存在,且位数与项目编译平台完全匹配 - 若使用虚拟环境,确保PYTHONPATH包含虚拟环境的
site-packages目录(示例中已修正路径)
内容的提问来源于stack exchange,提问作者Impostor Syndrome
相关产品推荐
相关产品推荐

