我应该与我的应用程序重新分配msvcrt.dll?

我应该重新分配msvcrt.dll与我的应用程序,并使用私人DLL如果一些应用程序的库dynamic依赖msvcrt.dll? 即与系统的msvcrt.dll(DLL地狱)可能的任何不兼容问题? 应用程序是针对Windows Server系统的。

msvcrt – 是Microsoft Visual C ++运行库的dynamic库。

在Windows中使用C运行时有两个选项:

  1. 链接与静态运行库。
    使用/MT/MTd选项cl.exe。 在这种情况下,你将不依赖于msvcrt DLL,因此你不必重新分配它。 在Visual Studio中,右键单击项目或解决scheme,属性> C / C ++ – >代码生成 – >运行时库分别使用MultithreadedMultithreadeddebugging 。 这是更简单的方法。 缺点是由此产生的可执行文件较大。

  2. 链接到dynamicC运行时库。
    您将使用/MD/MDd选项cl.exe。
    在Visual Studio中,右键单击项目或解决scheme,属性> C / C ++ – >代码生成 – >运行时库分别使用multithreadingdynamic链接multithreadingdynamic链接debugging 。 这会导致一个较小的EXE,但缺点是在安装应用程序时必须安装所需的MSVCRT。


VC ++编译器的每个版本都附带一个C运行时(CRT)版本。 编译器的v8附带的Visual Studio 2005和CRT的v8。 v8的实际DLL是msvcrt80.dll。 对于VS2008,它是V9,dynamicCRT是msvcrt90.dll。 但是,CRT更新和修补比C / C ++编译器更频繁。 开发人员可以下载更新的CRT,并build立反对。

如果使用dynamicCRT库进行编译,则必须从microsoft.com下载适用于所需版本运行时的可再发行组件包,并在应用程序安装期间执行(可能是静音的)安装。


在VS2005之前,开发人员构build的应用程序依赖于Windows操作系统中的MSVCRT。 这将使DLL(小图像大小)的好处,而不会导致在应用程序安装运送CRT DLL的要求。 在Windoes 2000之前,开发人员甚至会在\ Windows安装文件夹中安装一个新的MSVCRT.dll。 但是,在许多应用程序和操作系统上共享CRT显然是一个非常糟糕的主意。 使用WinXP SP2时,Windows随附的CRT发生了显着变化,任何取决于该版本CRT的应用程序都有可能中断。

此时,Microsoft告诉开发人员,Windows中包含的MSVCRT.dll是操作系统的一部分,并且可能随时进行维修或修补。 不支持构build一个应用程序。 因此应用程序应该使用上面的方法之一。

参考文献:

  • MSDN上的VC ++参考文档 。
  • 下载的MSVCRT90 v9.0.21022(x86 VS2008)redist
  • 下载为MSVCRT90 v9.0.30729.4148(x86 VS2008 SP1)

必须运送您的应用程序msvcrt。 这不是操作系统的保证部分。 如果一个特定版本的Windows 碰巧拥有它,那只是因为Windows中的某些东西正在使用它。

当新版本的Windows没有包含人们认为Windows所附带的二进制文件时,应用程序已经崩溃。 当用户select不安装WinFax时,应用程序崩溃了,这意味着msvcrt没有安装。

Raymond Chen :

根据您正在运行的Windows版本,可能会有各种各样的支持DLL,用于不是正式产品组件的东西,但仅供参考。

这个问题今天依然存在。 人们去寻找Windows附带的二进制文件,寻找可以重新安装的东西。 当那些二进制文件彻底改变或消失时,他们感到惊讶。

从KB326922 – 在Visual C ++中重新分配共享的C运行时组件 :

… CRT DLL不再被认为是一个系统文件,因此,分发与任何依赖它的应用程序的CRT DLL。 因为它不再是一个系统组件,所以将它安装到应用程序的Program Files目录中,并使用其他特定于应用程序的代码。 这可以防止您的应用程序使用可能安装在系统path上的其他CRT库的版本。

如果链接到MSVCRT 必须运送msvcrt与您的应用程序。

更多

决定放弃并声明一个操作系统DLL,仅由操作系统组件使用。

尽pipeMSVCRT.DLL长期以来一直是一个操作系统DLL, 并被logging为应用程序的禁区 ,但仍有许多人 将其视为C运行时交付渠道 ,而这些程序创造了很多产品团队的悲痛。

必须使用您的应用程序重新分发Microsoft Visual C运行时,因为Windows不附带任何Microsoft Visual C运行时。 可能碰巧有一个名为msvcrt.dll的DLL(不能保证),它不是MSVCRT。

克里斯的回答不应该被拒绝,因为两者都是正确的。

问题是有两套不同的MSVCRT。 一套是Visual Studio附带的msvcrt80.dll,msvcrt90.dll等。 这是人们通常使用的。 正如其他答案中所说的那样,他们必须重新分配。

另一个是System32文件夹中的msvcrt.dll(文件名中没有数字),这个文件夹早就被操作系统自己使用了。 应用程序不应该replace/重新安装它。 但是,有些应用程序会链接到它,因为某些原因想要删除额外的依赖项来安装。 但请注意,在将来的Windows版本中不保证可用。

msvcrt.dll已成为操作系统发行的实际部分。 在Windows 98和95以及可能是NT4的情况下,如果有人去关心安装中的WordPad之类的应用程序,就可以在没有安装的情况下安装操作系统。

然而,考虑到它的优点,以及由于这些操作系统很less有应用程序开发人员不屑于发布它,至less从Windows 2000开始,它已经成为操作系统的官方组成部分。

Microsoft支持有一个工具 ,您可以用来仔细检查哪些产品的DLL是随附的。

执行这样的search,你可以看到msvcrt.dll vsrsion 7.0.3790.0是Windows Server 2003发行版的一部分。