【发布时间】: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