【问题标题】:Correct way to distribute VC++ runtime files分发 VC++ 运行时文件的正确方法
【发布时间】:2011-01-12 14:58:27
【问题描述】:

我有一个 MFC 应用程序,我正在尝试打包以进行部署。它似乎取决于文件“msvcr90.dll”、“msvcp90.dll”和“mfc90.dll”。分发这些文件的正确方法是什么?

我不能使用合并模块,因为我的安装程序不支持它们。 我知道我可以运行 VCRedist_x86.exe,但出于各种原因我不想这样做。

据我所知,我唯一的选择是将文件安装为 Private Side-by-Side 程序集。这是正确的吗?

根据http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx,安装私有程序集的正确方法是将“Microsoft.VC90.CRT”和“Microsoft.VC90.MFC”文件夹复制到与可执行文件相同的文件夹中。这是解决问题的正确方法吗?它可以工作,但是以这种方式复制系统文件似乎有点 1990 年代。任何人都可以向我展示一个这样做的另一个应用程序(或至少一个演示项目)的示例吗?

最后,我什么时候需要担心为我的应用程序分发 .manifest 文件?我应该显式安装 XML 文件,还是以某种方式嵌入到我的可执行文件中?

【问题讨论】:

  • FWIW 我问了一个关于运送 CRT DLL 的类似问题。 stackoverflow.com/questions/2131093/…
  • 欢迎来到 DLL Hell,第 3 章。*(前两章讨论文件位置问题和版本问题。)

标签: c++ deployment assemblies runtime crt


【解决方案1】:

您也可以考虑同时使用 MFC 和 CRT 进行静态链接,然后您只需发送您的 EXE 文件。不过,这有利也有弊。

【讨论】:

【解决方案2】:

我会说将这些 dll 与您的 exe 一起放置就足够了,因为当前路径是首先查找它们的位置。

当然,您应该努力安装可再发行组件,因为这是更安全的方法。

【讨论】:

  • 使用可再发行组件是current recommendation by Microsoft
  • 这是正确答案。 Microsoft recommends 安装可再发行组件或将 dll 与可执行文件一起安装。引用:“要部署可再发行 Visual C++ 文件,可以使用 Visual Studio 中包含的 Visual C++ Redistributable Packages 或使用可再发行合并模块,也可以直接在应用程序本地文件夹中安装可再发行 Visual C++ DLL,即文件夹包含可执行应用程序文件。”
【解决方案3】:

通常我会说您应该在目标机器上安装所需的可再发行组件,因为它是“干净的方式”。但你也可以按照 90 年代的风格来做。这在很大程度上取决于您用于构建应用程序的 CRT/MFC 库。这可以在清单文件中进行检查。您还可以强制应用程序与指定的库绑定。没有任何定义 VS2008 通常绑定的是 9.0.21022.8,用

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

使用最新的库。也可以绑定指定版本:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"

和/或

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1"

因此,如果您想按照 90 年代的风格进行操作,请从 C:\Windows\Winsxs\ 复制文件并从您绑定的文件夹中获取 DLL,例如如果您将 CRT 用于 x64 应用程序,则来自 amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4 或等效的 x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d 用于 x86 版本的 CRT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2011-11-09
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多