15

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

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

不支持重新分发在没有清单的情况下构建的 C/C++ 应用程序。如果没有将应用程序绑定到这些库的清单,C/C++ 应用程序就不能使用 Visual C++ 库。有关详细信息,请参阅选择部署方法

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

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

[编辑] 该软件经常更新,因此 DLL 比静态链接更受欢迎。[/编辑]

我怎样才能成功地分发必要的文件,同时降低开销?

4

4 回答 4

27

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

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

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

于 2008-11-06T07:24:47.033 回答
13

我们使用这个:Howto:在不安装 vcredist_x86.exe 的情况下部署 VC2008 应用程序

本质上

  • 不要在您的 exe 文件中嵌入清单。
  • 将 C++ DLL 及其清单复制到您的应用目录。
  • 从所有清单(您的和 Microsoft 的)中删除“publicKeyToken”。
  • 如有必要,更改应用清单文件中的版本信息以匹配 Microsoft 清单文件(反之亦然)
于 2008-10-07T03:05:39.293 回答
4

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

于 2008-10-07T02:21:38.197 回答
1

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

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

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

于 2008-10-07T02:37:27.837 回答