【问题标题】:Cannot run Winforms application with C++ library on Windows 7 and 8.1无法在 Windows 7 和 8.1 上使用 C++ 库运行 Winforms 应用程序
【发布时间】:2018-07-10 16:58:31
【问题描述】:

我有一个 WinForms 应用程序,它有一个名为 DeviceAccess 的 C++ 库。 C# 库面向 .NET Framework 4.5.1 (x86),我的 C++ 库面向 Windows SDK 版本 8.1 和 Platform Toolset Visual Studio 2017 (v141) 和 Win32。我正在我的 Windows 10 机器上构建应用程序并尝试通过 Windows 8.1 和 Windows 7 的虚拟机运行。

我已经在 targetver.h 中设置了这两个定义,如下所示:

#pragma once

#define WINVER 0x0601
#define _WIN32_WINNT 0x0601 

#include <SDKDDKVer.h>

但是,当我通过 Windows 8.1 或 Windows 7 的虚拟机打开应用程序时,仍然出现以下错误:

Could not load file or assembly '...DeviceAccess.dll' or one of its dependencies. The specified module could no be found.

我的 .dll 与应用程序位于同一文件夹中。

有人知道为什么我无法加载 C++ 库吗?

编辑: 我运行进程监视器并过滤掉丢失的DLL,如下图:

我觉得丢失的 VCRUNTIME140.dll 可能是问题所在?

编辑2:

来自 Dependecy Walker 我在加载该 DLL 时遇到了这些错误:

【问题讨论】:

  • "或其依赖项之一" - 您能否验证所有依赖项都可用?过去我们曾经为此使用 Dependency Walker,这里是 a suggestion of a modern replacement。您可以尝试在 dll 上运行 regsvr32,如果缺少依赖项也会出错。 (如果不是,如果您的 DLL 不是 COM,它将出错。)或者您可以使用 Sysinternals Process Monitor 来观察负载并查看它试图访问和失败的文件,但这会生成大量日志,需要一些努力才能涉水而过。
  • 我试图在 dll 上运行 regsvr32,它给了我这个错误:“模块“PATH\DeviceAccess.dll”加载失败。确保二进制文件存储在指定路径或调试它检查二进制或相关 .DLL 文件的问题。找不到指定的模块。"
  • 嗨@rup,我已经用进程监视器分析更新了我的问题
  • 太棒了。很难从中分辨出它确实找到了哪些,而它从未设法找到哪些。但是如果是 VCRUNTIME140 那么你可能想要 VS2015(我认为是 14.0 版)vcredist.exe 从这里:support.microsoft.com/en-gb/help/2977003/…
  • Dependency Walker 不理解现代 Windows 中的 SxS 加载。是的,这可能是问题所在,但我不知道依赖 walker 输出是否可靠。

标签: c# c++ winforms target-platform


【解决方案1】:

所以我解决了我自己的问题。 我有一个带有以下命令的 WiX 安装程序:

<DirectoryRef Id="TARGETDIR">
    <Merge Id="VCRedist" SourceFile="..\MergeModules\Microsoft_VC140_CRT_x86.msm" DiskId="1" Language="0"/>
    <Merge Id="VCRedist2" SourceFile="..\MergeModules\Microsoft_VC140_CXXAMP_x86.msm" DiskId="1" Language="0"/>
</DirectoryRef>

<Feature Id="VCRedist" Title="Visual C++ 14.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VCRedist"/>
    <MergeRef Id="VCRedist2"/>
</Feature>

其中部署了 msvcp140.dll 和 vcruntime140.dll。但是我仍然缺少通用 CRT 的 api dll。所以我用这个approach

2015 年 9 月 11 日更新:支持通用 CRT 的应用本地部署。要获取用于应用本地部署的二进制文件,请安装适用于 Windows 10 的 Windows 软件开发工具包 (SDK)。这些二进制文件将安装到 C:\Program Files (x86)\Windows Kits\10\Redist\ucrt。您需要使用您的应用程序复制所有 DLL(请注意,不同版本的 Windows 所需的 DLL 集是不同的,因此您必须包含所有 DLL,以便您的程序在所有受支持的 Windows 版本上运行)。

因此,在我将所有二进制文件从 x86 复制到我的应用程序文件夹后,我能够在 Windows 8.1 VM 上运行它。

编辑:对于那些对如何在 WiX 安装程序中部署通用 CRT dll 感到好奇的人,我关注了 this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2014-04-20
    • 2017-08-31
    • 2015-02-13
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多