不使用VCRedist_x86.exe安装Visual C++ Redistributables

15

我的开发环境受到严格的限制,但开发人员对其也有严格的控制。

VCRedist_x86.exe是一个4MB的可再分发文件,传输需要四个小时。我更喜欢只重新分发MFC90.dll、msvcm90.dll、msvcp90.dll和msvcr90.dll这些文件,这样只需要2MB。然而,《重新分发Visual C++文件》中指出:

不支持未使用清单构建的C/C++应用程序的重新分发。在未绑定应用程序与这些库的清单的情况下,C/C++应用程序无法使用Visual C++库。有关详细信息,请参阅《选择部署方法》。

在这个新的清单世界中,将DLL文件复制到程序的工作目录似乎行不通。

我的下一个猜测是捣鼓一下所需的注册表项,以便将文件填充到WinSxS目录中并自己填充它们(而不是使用那个4MB的程序)。

[编辑]软件经常更新,因此强烈推荐使用DLL文件而不是静态链接。[/编辑]

如何成功地分发必要的文件并降低开销?

4个回答

27

【我是微软现任的SxS维护人员】

我强烈建议不要从清单中删除publicKeyToken属性。只要保留这个属性,dll文件的私有部署将会很好地工作。 然而,如果要在目标机器上集中安装更新版本的CRT,则移除该属性将阻止您的应用程序受益于安全更新,因为依赖关系将不再匹配。

因此,总结一下:可以安全地嵌入默认的清单。直接将CRT清单+DLL文件复制到可执行文件的目录中,不需要进行任何编辑。 兼容Win2k +。


3
你好Eugene:你的意思是,如果你在应用程序中部署了本地CRT/MFC等DLL和清单文件,那么影响这些文件的Windows更新将会在你的安装目录中找到它们并对其进行更新?!?! - HotOil

13
我们使用以下方法: 如何在不安装vcredist_x86.exe的情况下部署VC2008应用程序 基本上:
  • 不要将清单嵌入exe文件中。
  • 将C++ DLL及其清单复制到应用程序目录中。
  • 从所有清单(您和Microsoft的)中去掉“publicKeyToken”。
  • 如果必要,更改您应用程序清单文件中的版本信息以匹配Microsoft清单文件(或反之亦然)

4
在编译器属性页面中,将“运行时库”设置为/MT(多线程)。这会静态链接到运行时库,因此您不需要安装可再发行组件。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接