Visual C ++ Redistributables而不使用VCRedist_x86.exe

时间:2008-10-07 02:17:38

标签: visual-c++ dll winsxs

我正在一个受到严重限制的环境中开发,但开发人员也可以严格控制。

VCRedist_x86.exe - 一个4Mb可再发行组件 - 并不好玩(传输4小时)。我真的更喜欢重新分发MFC90.dll,msvcm90.dll,msvcp90.dll和msvcr90.dll - 这更像是2Mb。但是,Redistributing Visual C++ Files说:

  

不支持重新分发没有清单构建的C / C ++应用程序。如果没有清单将应用程序绑定到这些库,则C / C ++应用程序无法使用Visual C ++库。有关更多信息,请参阅Choosing a Deployment Method

我最初计划将DLL复制到程序的工作目录中似乎没有 在这个勇敢的新世界中工作。

我的下一个猜测是提取将文件填充到WinSxS目录所需的注册表项并自己填充(而不是使用4 meg程序)。

[edit]软件经常更新,因此DLL非常适合静态链接。 [/ edit]

如何成功分发必要的文件但保持开销?

4 个答案:

答案 0 :(得分:27)

[我是微软当前的SxS维护者]

我强烈建议反对从清单中删除publicKeyToken属性。 dll的私有部署将完好无损,此属性保持不变。 但是,如果在目标计算机上集中安装了较新版本的CRT,则删除它将阻止您的应用程序从安全更新中受益,因为依赖项将不再匹配。

因此,总结一下:使用默认值嵌入清单是安全的。将CRT清单+ DLL文件直接复制到可执行文件的目录中,不进行编辑。而已。兼容的Win2k +。

答案 1 :(得分:13)

我们使用此:Howto: Deploy VC2008 apps without installing vcredist_x86.exe

基本上

  • 不要在exe文件中嵌入清单。
  • 将C ++ DLL及其清单复制到应用程序的目录中。
  • 从所有清单(您和Microsoft的清单)中删除“publicKeyToken”。
  • 如有必要,请更改应用清单文件中的版本信息以匹配Microsoft清单文件(反之亦然)

答案 2 :(得分:4)

为编译器属性页中的“运行时库”设置指定/ MT(多线程)。这静态链接到运行时库,因此您不必安装可再发行组件。

答案 3 :(得分:1)

将它们安装为私有程序集。见这里:

http://msdn.microsoft.com/en-us/library/ms235291.aspx

请注意,如果您不需要提供的所有DLL,则可以修改清单文件以仅引用您需要的文件。