【发布时间】:2015-10-16 21:16:27
【问题描述】:
我使用 C++/CLI 编写了一个 DLL,它在我的 Windows 7 x64 PC 上运行良好。它唯一的依赖是 VC++(msvcr120、msvcr120_clr0400 和 msvcp120)和一些 OpenCV 的模块(opencv_core2410、opencv_high2410、opencv_imgproc2410)。
我已尝试在 Windows Server 2008 R2 上运行使用此 DLL 的代码。该服务器安装了两个版本 (x86/x64) 的 MSVC++ 2013 Redist,并且我验证了 DLL 存在于 C:\Windows\System 文件夹中。
我已经通过 IIS 服务和 Windows 窗体对其进行了测试,在这两种情况下都找不到 MSVCP120.dll。我使用进程监视器进行了检查,它在 C:\Windows\SysWoW64、C:\Windows\system、C:\Windows 和许多其他文件夹中查找此文件,但不在 C:\Windows\System32 上。
于是我将 System32 文件夹中的 MSVC*120 文件复制到了可执行文件夹中,并正常执行。那么,我该如何解决这个问题?只复制 DLL 更容易,但我认为这不是最佳做法,我应该做些什么来确保它在正确的文件夹中查找 DLL?
【问题讨论】:
-
您认为这是 x64 代码的假设是错误的。进程监视器告诉你发生了什么,只有一个 32 位进程会在 c:\windows\syswow64 中查看。不要更改任何内容,这些 DLL 的本地副本是最好的。
-
@HansPassant 使用 dll 的软件是 32 位的,我猜它应该与 32 位 C++ Redist 一起工作,通常它确实可以工作。我不明白为什么它适用于 64 位的 dll。
-
@HansPassant 所以我确实尝试按照你所说的去做:我将 x86 dll 复制到二进制文件夹中并运行,并且还修复了我在其他地方遇到的另一个错误。不过,我想知道为什么它没有打开 SysWOW64 文件夹中的 dll。我将开始部署包含这些 dll 的包,即使目标机器安装了 C++ redist。