我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)可能出现的任何不兼容问题?应用程序针对Windows Server系统.
msvcrt - 是Microsoft Visual C++运行时的动态库.
在Windows中使用C运行时有两个选项:
链接静态运行时库.
使用cl.exe /MT
的/MTd
选项或选项.在这种情况下,您将不依赖于msvcrt DLL,因此您不必重新分发它.在Visual Studio中,右键单击项目或解决方案,属性> C/C++ - >代码生成 - >运行时库分别使用多线程和多线程调试.这是更简单的方法.缺点是生成的可执行文件更大.
链接到动态C运行时库.
您将使用cl.exe /MD
的/MDd
选项或选项.
在Visual Studio中,右键单击项目或解决方案,属性> C/C++ - >代码生成 - >运行时库分别使用多线程动态链接和多线程动态链接调试.这会导致较小的EXE,但缺点是您必须在安装应用程序时安装所需的MSVCRT.
每个版本的VC++编译器都附带一个C运行时版本(CRT).Visual Studio 2005附带编译器的v8和CRT的v8.v8的实际DLL是msvcrt80.dll.对于VS2008,它是v9,动态CRT是msvcrt90.dll.但是,CRT比C/C++编译器更新和修补更频繁.开发人员可以下载更新的CRT,并针对此进行构建.
如果使用动态CRT库进行编译,则必须从microsoft.com下载适用于运行时所需版本的可再发行软件包,并在应用安装期间执行(可能是静默的)安装.
在VS2005之前,开发人员构建的应用程序依赖于Windows操作系统中的MSVCRT.这将带来DLL的好处(小图像大小),同时不会产生在应用程序安装中运送CRT DLL的要求.在Windoes 2000之前,开发人员甚至会在\ Windows安装文件夹中安装新的MSVCRT.dll.但是,在许多应用程序和操作系统之间共享CRT,结果证明是一个非常糟糕的主意.在WinXP SP2中,Windows附带的CRT发生了重大变化,任何依赖于该版本CRT的应用程序都存在破坏的风险.
此时微软告诉开发人员,Windows附带的MSVCRT.dll是操作系统的一部分,可以随时进行维修或修补.不支持构建针对它的应用程序.因此,应用程序应使用上述方法之一.
参考文献:
MSDN上的VC++参考文档.
下载为MSVCRT90 v9.0.21022(x86 VS2008)的redist
下载为MSVCRT90 v9.0.30729.4148(x86 VS2008 SP1)的redist
您必须随应用程序一起发送msvcrt.它不是操作系统的保证部分.如果特定版本的Windows 碰巧拥有它,那只是因为Windows中的某些东西正在使用它.
当较新版本的Windows没有碰巧包含人们认为Windows附带的二进制文件时,应用程序已经崩溃.当用户选择不安装WinFax时,应用程序已经崩溃,这意味着没有安装msvcrt.
来自Raymond Chen:
根据您运行的Windows版本,可能存在各种支持DLL,这些DLL不是正式的产品组件,而是仅用于搭载.
...
这个问题今天仍然存在.人们围着Windows附带的二进制文件寻找他们可以改造的东西.然后当这些二进制文件完全改变或消失时,他们会感到惊讶.
从KB326922开始 - 在Visual C++中重新分发共享C运行时组件:
... CRT DLL不再被视为系统文件,因此,将CRT DLL与任何依赖它的应用程序一起分发.因为它不再是系统组件,所以使用其他特定于应用程序的代码将其安装在应用程序Program Files目录中.这可以防止您的应用程序使用可能安装在系统路径上的其他版本的CRT库.
你必须附带MSVCRT与您的应用程序,如果您链接到MSVCRT.
更多
决定放弃并声明它是一个操作系统DLL,只能由操作系统组件使用.
虽然
MSVCRT.DLL
已经有很长一段时间的运行系统DLL,并已被记录为禁地应用程序,还是有很多人谁把它当作C运行时交付渠道,以及这些方案的创造了很多的悲伤产品团队.
您必须使用您的应用程序重新分发Microsoft Visual C运行时,因为Windows不附带任何Microsoft Visual C运行时.有可能发生的是一个叫做DLL msvcrt.dll
(这是不保证的),它是不是在 MSVCRT.
克里斯的答案不应该被否决,因为两者都是正确的.
问题是有两套不同的MSVCRT.一套是Visual Studio附带的msvcrt80.dll,msvcrt90.dll等.这是人们通常使用的.他们必须重新分配,正如其他答案中所说的那样.
另一个是System32文件夹中的msvcrt.dll(文件名中没有数字),该文件仅供操作系统自身使用.应用程序永远不应该替换/重新安装它.但是,某些应用程序会链接到它,出于某些原因,例如删除要安装的额外依赖项.但请注意,不保证在将来的Windows版本中可用.
msvcrt.dll已成为操作系统发行版的真实部分.在Windows 98和95以及可能的NT4上,有可能在没有它的情况下安装操作系统,如果有人去处理将WordPad等应用程序从安装中删除.
然而,鉴于它的无处不在,以及由于这些操作系统很少有应用程序开发人员费心去发货,至少从Windows 2000开始它就是操作系统的官方部分.
Microsoft支持有一个工具,您可以使用它来仔细检查DLL随附的产品.
执行像搜索这样,你可以看到,MSVCRT.DLL vsrsion 7.0.3790.0是在Windows Server 2003版本的一部分.