当前位置:  开发笔记 > 后端 > 正文

我应该用我的应用程序重新分发msvcrt.dll吗?

如何解决《我应该用我的应用程序重新分发msvcrt.dll吗?》经验,为你挑选了4个好方法。

我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)可能出现的任何不兼容问题?应用程序针对Windows Server系统.



1> justadreamer..:

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



2> Ian Boyd..:

必须随应用程序一起发送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.


是的,它确实.Windows SDK并不表示Windows XP/Vista/Seven将MSVCRT作为您可以使用的二进制文件提供的任何地方.Windows可能附带某些版本的MSVCRT,但它几乎肯定不是您所依赖的MSVCRT的确切版本.Windows Update不会为您的客户提供更新版本的运行时.微软开发人员Raymond Chen的博客有很多追随者,他谈到了人们做错事.这是正确的答案,无论是否是下来的人都想听到它.
这是不正确的.至少10年以来,msvcrt.dll一直是一个系统DLL.
@DavidHeffernan因此[不保证在那里](http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx).*("表示它是由Windows拥有和构建的系统组件.它仅供系统级组件使用.")*如果要使用它,则需要发货.如果您认为它始终存在于用户的计算机上:您做错了.

3> Dudu..:

克里斯的答案不应该被否决,因为两者都是正确的.

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

另一个是System32文件夹中的msvcrt.dll(文件名中没有数字),该文件仅供操作系统自身使用.应用程序永远不应该替换/重新安装它.但是,某些应用程序会链接到它,出于某些原因,例如删除要安装的额外依赖项.但请注意,不保证在将来的Windows版本中可用.


你永远不应该依赖于system32中的msvcrt.dll.它是Windows的一部分,没有记录或大概测试用于一般用途.有一天它可能会消失,或者您需要的功能可能会随着安全更新的一部分而改变,您的应用程序将被破坏.
带VC6的msvcrt.dll(来了吗?)与windows附带的msvcrt.dll不同.它碰巧具有相同的名称,但Windows附带的是Windows的未记录部分,而不是VC6的CRT.你不应该使用它.当然你也不应该使用VC6附带的msvcrt.dll,因为它已经多年没有支持并且没有修复所有的安全漏洞.VC6现在已经快15年了 - 你真的应该停止使用它了.

4> Chris Becke..:

msvcrt.dll已成为操作系统发行版的真实部分.在Windows 98和95以及可能的NT4上,有可能在没有它的情况下安装操作系统,如果有人去处理将WordPad等应用程序从安装中删除.

然而,鉴于它的无处不在,以及由于这些操作系统很少有应用程序开发人员费心去发货,至少从Windows 2000开始它就是操作系统的官方部分.

Microsoft支持有一个工具,您可以使用它来仔细检查DLL随附的产品.

执行像搜索这样,你可以看到,MSVCRT.DLL vsrsion 7.0.3790.0是在Windows Server 2003版本的一部分.


微软直接说(http://support.microsoft.com/kb/326922)msvcrt不再是系统组件.
@IanBoyd:当我读到它时,那篇文章只讨论msvcrtnn.dll,而不是普通的旧msvcrt.dll.
@rogerdpack:这是偶然的,不要依赖,就像[MFC](http://blogs.msdn.com/b/oldnewthing/archive/2008/01/11/7065021.aspx)甚至[.Net] (http://blogs.msdn.com/b/oldnewthing/archive/2011/04/04/10149346.aspx).
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有