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

能否通过应用程序清单从子目录并排加载python310.dll?

如何通过清单文件从子目录加载python310.dll?

问题描述

我有一个嵌入Python的C++应用程序,已将所有Python文件放置在application.exe根目录的子目录Libs中。目前加载Python时,需将python310.dll与application.exe放在同一目录(而非Libs内),但这种分离方式引发了其他问题,因此希望将该DLL放在Libs\python310.dll路径下。

我已创建application.exe.manifest文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        type="win32"
        name="Sampler"
        version="2.99.0.0"
        processorArchitecture="*"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="python310"
                version="3.10.11150.1013"
                processorArchitecture="x86"/>
        </dependentAssembly>
    </dependency>
    <file name=".\Libs\python310.dll"/>
</assembly>

但该配置无效,运行sxstrace时出现错误:

ERROR: Cannot resolve reference python310,processorArchitecture="x86",type="win32",version="3.10.11150.1013"

应用程序因无法找到python310.dll而无法启动。请问能否通过清单文件实现从子目录加载该DLL?


解决方案

核心问题分析

你的清单配置逻辑有误:<dependency>节点用于声明依赖的程序集,但单独的<file>节点无法让系统识别该DLL就是你依赖的python310程序集,两者需要正确关联才能生效。

可行的清单配置方案

你需要把python310.dll定义为私有程序集,再让主应用程序的清单依赖这个私有程序集:

  1. 创建python310.manifest,放在Libs目录下,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        type="win32"
        name="python310"
        version="3.10.11150.1013"
        processorArchitecture="x86"/>
    <file name="python310.dll"/>
</assembly>
  1. 修改主应用的application.exe.manifest,移除原有的<file>节点,添加<codeBase>指定依赖路径:
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        type="win32"
        name="Sampler"
        version="2.99.0.0"
        processorArchitecture="*"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="python310"
                version="3.10.11150.1013"
                processorArchitecture="x86"/>
            <codeBase version="3.10.11150.1013" href="Libs/python310.dll"/>
        </dependentAssembly>
    </dependency>
</assembly>

关键注意事项

  • <codeBase>节点指定了依赖程序集的相对路径,系统会据此查找python310.dll和对应的清单文件
  • 确保python310.dll与python310.manifest都位于Libs目录下,路径匹配无错误
  • 版本号、处理器架构必须与DLL的实际属性完全一致,否则会出现解析失败

替代方案(无需清单)

如果清单配置仍有问题,可在C++代码中手动指定DLL加载路径:

#include <windows.h>
#include <Python.h>

int main() {
    // 手动加载Libs目录下的python310.dll
    HMODULE hPython = LoadLibrary(L"./Libs/python310.dll");
    if (!hPython) {
        // 处理加载失败逻辑
        return 1;
    }

    // 初始化Python环境
    Py_Initialize();

    // 执行Python相关操作...

    // 清理资源
    Py_Finalize();
    FreeLibrary(hPython);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:37:46