我在 VS 2005 中为本机 Win32/非托管 C++ 创建了一个 DLL 项目,将其命名为 myProj.dll。它依赖于第 3 方商业 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++ 库。更重要的是,如果我将依赖项遍历器指向thirdParty.dll,它会很高兴地解析对该位置的引用。
但是,如果我将 dependent.exe 指向我的测试应用程序 (.exe) 或 myProj.dll,则找不到 msvcr90.dll 和 msvcp90.dll。
我猜我需要在 VS2005 中配置一些东西,以便 .exe 或 myProj.dll 知道 9.0 版本的 std C++ 库的位置(大概是 redist 包将它们安装在 C:\WINDOWS\WinSxS 中的位置) ),但我似乎无法弄清楚它是什么。我走在正确的轨道上吗?
我注意到,如果我只是将 msvc*90.dll 文件复制到我的应用程序目录,那么依赖关系就会得到解决,但我会收到有关 std c++ DLL 加载不当等的运行时错误。
预先非常感谢。
这看起来像一个“并排大会”问题给我。
据我所知,微软试图阻止DLL Hell过去几年的问题引入了一个概念“并排大会”。
简而言之,这意味着您的应用程序需要告诉Windows哪个版本的CRT它的设计目的是与.安装应用程序时,Windows 将确保您的应用程序获得这些 DLL 文件的自己的私有副本。
为了使其正常工作,您需要将应用程序的 DLL 依赖项嵌入到应用程序中Manifest文件并将其附加到项目中使用清单工具, 输入输出应用程序项目设置部分。
作为一个例子,这里是我使用的清单Windows 版宙斯 http://www.zeusedit.com 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>
最后,如果您计划制作安装程序,则需要将这些 DLL 文件的相同版本添加到应用程序安装程序中,或者让您的安装程序运行 Microsoft CRT 可再发行安装程序。
FWIW当用户报告时我才发现这一点Zeus http://www.zeusedit.com由于缺少 MSVCRT 运行时 DLL 文件,不再在 Windows XP 上运行Zeus http://www.zeusedit.com10 多年来一直运行良好,无需附带 MSVCRT 运行时 DLL 文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)