正确的分发VC++运行库文件方式

7

我有一个MFC应用程序,我正在尝试打包部署。它似乎依赖于文件'msvcr90.dll'、'msvcp90.dll'和'mfc90.dll'。正确的分发这些文件的方式是什么?

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

据我所知,我唯一的选择是将文件安装为私有Side-by-Side组件。这是正确的吗?

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

最后,我何时需要担心分发我的应用程序的.manifest文件?我是否需要显式安装XML文件,还是它已经嵌入到我的可执行文件中了?


顺便说一句,我曾经问过一个类似的关于运输CRT DLL的问题。https://dev59.com/EUvSa4cB1Zd3GeqPfIqa - Rob
欢迎来到 DLL 地狱,第三章。(前两章讨论了文件位置问题和版本问题。) - Thomas Matthews
请注意,您链接的文章不再建议复制任何DLL文件,而是重定向到vcredist下载页面。 - rustyx
3个回答

1
通常我会建议你在目标机器上安装所需的可再发行组件,因为这是“干净的方式”。但你也可以采用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,例如,对于x64应用程序使用CRT,则可以从 amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4 获取,而对于x86版本的CRT则使用等效的 x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d


1

您也可以考虑使用MFC和CRT进行静态链接,这样您只需要发送EXE文件即可。不过这种方法有利有弊。


2
没错,但是微软不鼓励静态链接 - skst

1

我会建议你将这些 DLL 与你的 exe 放在一起,因为当前路径是首先搜索它们的位置。

当然,你应该努力安装可再发行组件包,因为那是更安全的做法。


1
使用可再分发组件是微软的当前建议。 - skst
这是正确的答案。Microsoft建议安装可再发行包或将dll与可执行文件一起安装。引用:“要部署可再发行的Visual C++文件,您可以使用Visual Studio中包含的Visual C++可再发行包或使用可再发行合并模块,或者直接在应用程序本地文件夹(即包含可执行应用程序文件的文件夹)中安装可再发行的Visual C++ DLL。” - Marc

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