VS 2005 C++项目中的msvcr90.dll依赖项

7 c++ dll visual-studio-2005

我在VS 2005中为本机Win32 /非托管C++创建了一个DLL项目,称之为myProj.dll.这取决于第三方商业DLL,而后者依赖于msvcr90.dll(我假设它是从VS 2008项目构建的).我将其称为thirdParty.dll.

我的DLL项目在VS2005中构建得很好.我已经构建了一个链接到myProj.lib的测试应用程序(同样,VS 2005 Win32 C++).(顺便说一下,根据.lib的小尺寸来判断,并且在运行时,应用程序必须找到myProj.dll,我猜测.lib只是一个调用的包装器. loadLibrary()加载实际的DLL;是关闭吗?)

我的问题是,在运行时,测试应用程序无法找到msvcr90.dll(也不是msvcp90.dll),其依赖性来自thirdParty.dll.

我已经安装了Microsoft的redist包,所以在c:\ WINDOWS\WinSxS\x86_Microsoft.VC90.CRT _...中安装了所有std(9.0)C++库.更重要的是,如果我将依赖性walker指向thirdParty.dll,它会愉快地解析对该位置的引用.

但是,如果我将depends.exe指向我的测试应用程序(.exe)或myProj.dll,则找不到msvcr90.dll和msvcp90.dll.

我猜我需要在VS2005中配置一些东西,以便.exe或myProj.dll知道std C++库的9.0版本的位置(可能是redist包在C:\ WINDOWS\WinSxS中安装它们的位置) ),但我似乎无法弄清楚它是什么.我是在正确的轨道上吗?

我注意到,如果我只是将msvc*90.dll文件复制到我的app目录,那么依赖项就解决了,但是我得到了关于std c ++ DLL等的不正确加载的运行时错误.

非常感谢提前.

jus*_*sij 6

这看起来像是一个"并排组件"问题.

据我所知,微软试图阻止过去几年的DLL Hell问题引入了"并排组件"的概念.

在坚果壳中,这意味着您的应用程序需要告诉Windows它设计使用的CRT版本.安装应用程序时,Windows将确保您的应用程序获得这些DLL文件的私有副本.

要使其全部工作,您需要将应用程序的DLL依赖项嵌入到应用程序清单文件中,并使用应用程序项目设置的清单工具,输入和输出部分将其附加到项目中.

这里的示例是我用于Zeus for Windows IDE 的清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
      name="Xidicone.Windows.Zeus for Windows"
      version="3.9.6.69"
      processorArchitecture="X86"
      type="win32" />

  <description>Zeus for Windows</description>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
            type="win32"
            name="Microsoft.VC80.CRT"
            version="8.0.50608.0"
            processorArchitecture="x86"
            publicKeyToken="1fc8b3b9a1e18e3b" />
    </dependentAssembly>
  </dependency>

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="X86"
          publicKeyToken="6595b64144ccf1df"
          language="*" />
    </dependentAssembly>
  </dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

最后,如果您计划制作安装程序,则需要将这些DLL文件的相同版本添加到应用程序安装程序,或者让安装程序运行Microsoft CRT可再发行组件安装程序.

FWIW我只是在用户报告Zeus因为缺少MSVCRT运行时DLL文件而不再在Windows XP上运行时发现了这一点,但Zeus已经工作了10多年而没有必须随附MSVCRT运行时DLL文件.


Tim*_*Tim 1

我会向第三方 dll 人员询问此事。