【问题标题】:My dll needs x64 version of MSVCP120.dll, but it doesn't search the System32 folder我的 dll 需要 x64 版本的 MSVCP120.dll,但它不搜索 System32 文件夹
【发布时间】: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。

标签: c# windows dll c++-cli


【解决方案1】:

使用静态链接到 VS 运行时,而不是使用动态链接到运行时 DLL。

为此,您可以为您的 DLL 项目将 RunTime-Library 设置为多线程:

在 IDE 中通过 C/C++ > 代码生成 > 运行时库 > 多线程 (/MT) 或 (/MTd) 下的项目设置。

然后编译项目并在任何地方使用您的 dll 没有任何问题!。

注意:你应该在发布模式下编译你的项目。

【讨论】:

  • 对不起,我想我提供的信息不完整。我正在做的是本机 C++ 项目(编译为 .lib)的 C++/CLI 包装器。我不能将 /MT 与包装器一起使用,因为它与 C++/CLI 项目所必需的 /clr 标志不兼容。此外,C++/CLI 项目依赖于 MSVC*.dll 文件,所以我想如果我在本机项目上使用静态链接也没关系。
  • 我在这里找到了这个讨论,其中有人解释了 /MT 和 /clr 不兼容的原因:“考虑到不建议静态链接到 VC 库并应尽可能使用动态链接,它决定不启用 /MT /CLR VS2005"。这是错的吗? windows-tech.info/17/5f0fd2024b850de5.php
  • 很遗憾,我不确定这是不是真的,可能我错了,所以请参阅thisthis
  • 你看我不是不同意你,我只是怀疑。我认为我上面发布的链接中的人没有给出完整的解释,因为他没有说明为什么不推荐它。当然,当使用 /clr 时,这甚至不是一个选项,怎么会有人推荐它?但是当没有 CLR 时,我认为只有在 MS 自动更新客户端机器上的 MSVC 时,禁止静态链接才有意义,但我认为他们不会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多