C# 我的dll需要x64版本的MSVCP120.dll,但它没有';t搜索System32文件夹

C# 我的dll需要x64版本的MSVCP120.dll,但它没有';t搜索System32文件夹,c#,windows,dll,c++-cli,C#,Windows,Dll,C++ Cli,我已经使用C++/CLI编写了一个DLL,它在我的Windows 7 x64 PC上运行良好。它唯一的依赖项是VC++(msvcr120、msvcr120_clr0400和msvcp120)和一些OpenCV的模块(OpenCV_core2410、OpenCV_high2410、OpenCV_imgproc2410) 我已尝试在Windows Server 2008 R2上运行使用此DLL的代码。此服务器安装了MSVC++2013 Redist的两个版本(x86/x64),我验证了DLL是否存在

我已经使用C++/CLI编写了一个DLL,它在我的Windows 7 x64 PC上运行良好。它唯一的依赖项是VC++(msvcr120、msvcr120_clr0400和msvcp120)和一些OpenCV的模块(OpenCV_core2410、OpenCV_high2410、OpenCV_imgproc2410)

我已尝试在Windows Server 2008 R2上运行使用此DLL的代码。此服务器安装了MSVC++2013 Redist的两个版本(x86/x64),我验证了DLL是否存在于C:\Windows\System文件夹中

我已经通过IIS服务和Windows窗体对其进行了测试,但在这两种情况下都找不到MSVCP120.dll。我使用Process Monitor进行了检查,它在C:\Windows\SysWoW64、C:\Windows\system、C:\Windows和许多其他文件夹中查找此文件,但在C:\Windows\System32上没有


因此,我将MSVC*120文件从System32文件夹复制到可执行文件夹中,并正常执行。那么,我该如何解决这个问题呢?只复制DLL比较容易,但我认为这不是最佳做法,我应该做些什么来确保它在正确的文件夹中查找DLL?

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

为此,您可以将DLL项目的运行库设置为多线程:

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

然后编译项目并在任何地方使用dll,不会出现任何问题


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

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

为此,您可以将DLL项目的运行库设置为多线程:

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

然后编译项目并在任何地方使用dll,不会出现任何问题


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

您认为这是x64代码的假设是错误的。进程监视器告诉您发生了什么,只有32位进程在c:\windows\syswow64中进行过查找。不要改变任何东西,这些DLL的本地副本是最好的。@汉斯潘软件消费DLL是32位,我猜它应该与32位C++ ReDIST一起工作,通常它确实有效。我不明白为什么它能与64位的DLL一起工作。@HansPassant所以我试着按照你说的做了:我将x86 DLL复制到二进制文件夹中,它运行了,还修复了我在其他地方遇到的另一个错误。不过,我想知道为什么它没有打开SysWOW64文件夹中的DLL。我将开始使用这些DLL部署包,即使目标机器已经安装了C++ ReDIST。假设X64代码是错误的。进程监视器告诉您发生了什么,只有32位进程在c:\windows\syswow64中进行过查找。不要改变任何东西,这些DLL的本地副本是最好的。@汉斯潘软件消费DLL是32位,我猜它应该与32位C++ ReDIST一起工作,通常它确实有效。我不明白为什么它能与64位的DLL一起工作。@HansPassant所以我试着按照你说的做了:我将x86 DLL复制到二进制文件夹中,它运行了,还修复了我在其他地方遇到的另一个错误。不过,我想知道为什么它没有打开SysWOW64文件夹中的DLL。我将开始使用这些DLL部署包,即使目标机器已经安装了C++ ReDIST。抱歉,我想我已经提供了不完整的信息。我所做的是一个C++ C++ CLI包装器,用于本地C++项目(编译为.LIB)。我不能将/MT与包装器一起使用,因为它与/clr标志不兼容,这是C++/CLI项目所必需的。此外,C++/CLI项目依赖于MSVC*.dll文件,因此我想在我的本机项目上使用静态链接也没什么关系。我在这里找到了一些讨论,有人解释了/MT和/clr不兼容的原因:“考虑到不建议静态链接到VC库,并且应尽可能使用动态链接,因此决定不启用/MT/CLR VS2005”“这是错的吗?不幸的是,我不确定这是不是真的,可能是我错了,所以请看,你看,我不是不同意你,我只是在怀疑。我认为我在上面发布的链接上的人没有给出完整的解释,因为他没有说为什么不推荐。当然,当使用/clr时,这甚至不是一个选项,怎么会有人推荐它呢?但当没有CLR时,我认为只有在MS自动更新客户端机器上的MSVC时才有必要禁止静态链接,但我认为他们不会这样做。对不起,我认为我提供的信息不完整。我所做的是一个C++ C++ CLI包装器,用于本地C++项目(编译为.LIB)。我不能将/MT与包装器一起使用,因为它与/clr标志不兼容,这是C++/CLI项目所必需的。此外,C++/CLI项目依赖于MSVC*.dll文件,因此我想在我的本机项目上使用静态链接也没什么关系。我在这里找到了一些讨论,有人解释了/MT和/clr不兼容的原因:“考虑到不建议静态链接到VC库,并且应尽可能使用动态链接,因此决定不启用/MT/CLR VS2005”“这是错的吗?不幸的是,我不确定这是不是真的,可能是我错了,所以请看,你看,我不是不同意你,我只是在怀疑。我认为我在上面发布的链接上的人没有给出完整的解释,因为他没有说为什么不推荐。当然,当使用/clr时,这甚至不是一个选项,怎么会有人推荐它呢?但当没有CLR时,我认为只有在MS自动更新客户端机器上的MSVC时,才有必要禁止静态链接