Visual C++ 不使用 VCRedist_x86.exe 的可再发行组件

发布于 2024-07-06 10:24:30 字数 736 浏览 12 评论 0原文

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

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 比静态链接更受青睐。 [/edit]

如何成功分发必要的文件,同时降低开销?

I'm developing in an environment that is severely constrained, but the developers also have tight control over.

VCRedist_x86.exe - A 4Mb redistributable - is no fun (four hours to transfer). I'd really prefer to just redistribute MFC90.dll, msvcm90.dll, msvcp90.dll and msvcr90.dll - that's more like 2Mb. However, Redistributing Visual C++ Files says:

It is not supported to redistribute C/C++ applications that are built without a manifest. Visual C++ libraries cannot be used by C/C++ applications without a manifest binding the application to these libraries. For more information, see Choosing a Deployment Method.

My original plan of copying the DLLs into the program's working directory doesn't seem to
work in this brave new world of manifests.

My next guess is to bodge up the registry entries required to populate the files into the WinSxS directory and populate it myself (rather than using the 4 meg program).

[edit] The software is frequently updated, so DLLs are strongly preferred to static linking. [/edit]

How can I sucessfully distribute the necessary files but keep the overhead down?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

最美不过初阳 2024-07-13 10:24:30

[我是 Microsoft 的当前 SxS 维护者]

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

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

[I'm the current SxS maintainer at Microsoft]

I would strongly suggest against removing the publicKeyToken attribute from manifests. Private deployment of the dlls will work just fine with this attribute left intact.
However, removing it will prevent your app from benefiting from security updates should there be a newer version of the CRT installed centrally on the target machine, as the dependencies will no longer match up.

So, to summarize: it's safe to embed your manifest, with the default. Copy the CRT manifest + DLL files directly into your executable's directory, with no edits. That's it. Compatible Win2k+.

十六岁半 2024-07-13 10:24:30

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

本质上

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

We use this: Howto: Deploy VC2008 apps without installing vcredist_x86.exe

Essentially

  • Don't embed a manifest in your exe files.
  • Copy the C++ DLLs and their manifests to your app's directory.
  • Remove the "publicKeyToken" from all manifests (yours and Microsoft's).
  • If necessary, change the version info in your app's manifest files to match the Microsoft manifest files (or vice versa)
眼泪都笑了 2024-07-13 10:24:30

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

Specify /MT (Multithreaded) for the "runtime library" setting in the compiler property page. This statically links against the runtime library so you don't have to install the redistributable.

冷︶言冷语的世界 2024-07-13 10:24:30

将它们安装为私有程序集。 请参阅此处:

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

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

Install them as private assemblies. See here:

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

Note that if you don't need all of the DLLs provided you can modify the manifest files to only reference the ones you need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文