确定要重新分发的 DLL
在生成使用由 Visual Studio 提供的库 DLL 的应用程序时,应用程序的用户也必须在运行该应用程序的计算机上安装这些 DLL。 由于大多数用户可能没有安装 Visual Studio,因此你必须为他们提供这些 DLL。 Visual Studio 以可再发行文件的形式提供这些 DLL,可以将其包含到应用程序的安装程序中。
若要更轻松地将可再发行 DLL 包含到安装程序中,能够以独立可再发行组件包的形式获得它们。 这些包是特定于体系结构的可执行文件,它们使用集中部署将可再发行文件安装在用户的计算机上。 例如,vc_redist.x86.exe 为 x86 和 x64 计算机安装 32 位库;vc_redist.x64.exe 为 x64 计算机安装 64 位库;vcredist.ARM64.exe 为 ARM 和 ARM64 计算机安装库。 建议采用集中部署,因为 Microsoft 可以使用 Windows 更新服务来分别更新这些库。 除了 Visual Studio 安装中的副本,还可下载当前可再发行组件包。 若要查看当前和较旧版本工具集支持的最新可再发行组件包的链接,请参阅最新受支持的 Visual C++ 可再发行程序包下载。 通过在 my.visualstudio.com 中搜索“Visual C++ 可再发行程序包”,也许能找到特定较早版本的可再发行组件包。
仅支持使用与工具集相同或更高版本的可再发行组件包。 所部署的可再发行组件包的主版本号必须与创建应用程序所使用的 Visual Studio 工具集的版本相匹配,并且次要版本必须为相同版本或更高版本。 Visual Studio 2022、2019、2017 和 2015 都具有兼容的工具集版本号。 对于这些版本,任何较新的 Visual Studio 可再发行文件都可供通过较旧版本的工具集生成的应用使用。 例如,Visual Studio 2022 可再发行文件可供通过使用 Visual Studio 2017 或 2015 工具集生成的应用使用。 尽管它们可能是兼容的,但我们还是不支持在通过使用较新工具集生成的应用中使用较旧版本的可再发行文件。 例如,不支持在通过使用 2019 工具集生成的应用中使用 2017 可再发行文件。
还可以在合并模块中将可再发行 DLL 包含到安装程序中。 此方法现已弃用,因为以这种方式部署的库无法通过 Windows 更新自动更新。 可再发行合并模块或 Microsoft 安装程序模块(.msm 文件)是 Visual Studio 安装程序中提供的可选组件。 安装后,可在 %VCToolsRedistDir%\MergeModules\ 下的 Visual Studio 安装目录中找到可再发行 DLL 的合并模块。 在 Visual Studio 2015 和早期版本的 Visual Studio 中,这些文件位于 Program Files 或 Program Files (x86) 目录的 Common Files\Merge Modules 子目录中。 有关使用这些文件的详细信息,请参阅使用合并模块重新分发组件。
这些单独的可再发行 DLL 也随 Visual Studio 一起安装。 默认情况下,它们安装在 Visual 的 %VCToolsRedistDir%\debug_nonredist[architecture]\Microsoft.[toolset].[library] 文件夹中,其中 [architecture] 表示目标体系结构,[toolset] 表示工具集版本,以及 [library] 是具有调试 DLL 的调试库。
使用在这些目录中找到的任何库 DLL 文件、可再发行组件包或合并模块的最新版本。 可将这些库安装在与应用程序相同的目录中,以便将它们用于本地部署。 不建议进行本地部署,因为这样做就需要由你将更新内容传递到所部署的应用程序。 最好选择使用可再发行组件包进行集中部署。
若要确定必须与应用程序一起重新发布的 DLL,请收集应用程序所依赖的 DLL 列表。 这些 DLL 通常列为链接器的导入库输入。 默认包括一些特定的库(例如 vcruntime 和通用 C 运行时库 (UCRT))。 如果你的应用或应用的某个依赖项使用 LoadLibrary 来动态加载 DLL,可能不会将此 DLL 列入对链接器的输入。 若要收集动态加载的 DLL 的列表,有一种方式在应用上运行 Dependency Walker (depends.exe),如了解 Visual C++ 应用程序的依赖项中所述。 遗憾的是此工具已过时,并且可能会报告无法找到特定的 DLL。
获取依赖项列表后,将其与 Redist.txt 文件(位于 Microsoft Visual Studio 安装目录下)中链接的列表进行比较。 或者与可再发行 DLL 的“REDIST 列表”(在 Visual Studio 副本的 Microsoft 软件许可条款的“可分发代码文件”部分中引用)进行比较。 对于 Visual Studio 2022,请参阅 Visual Studio 2022 的可分发代码。 对于 Visual Studio 2019,请参阅 Visual Studio 2019 的可分发代码。 对于 Visual Studio 2017,请参阅 Microsoft Visual Studio 2017 的可分发代码(包括实用程序、可扩展性和 BuildServer 文件)。 对于 Visual Studio 2015,请参阅 Microsoft Visual Studio 2015 和 Microsoft Visual Studio 2015 SDK 的可分发代码(包括实用程序和 BuildServer 文件)。 对于 Visual Studio 2013,列表可以在 Microsoft Visual Studio 2013 和 Microsoft Visual Studio 2013 SDK 的可分发代码中联机获得。
在 Visual Studio 2015 以前的版本中,C 运行时库 (CRT) 作为可再发行 DLL 包含在 msvc[version].dll 中。 在 Visual Studio 2015 中,CRT 中的函数已重构到 vcruntime 和 UCRT 中。 UCRT 现在是 Windows 10 及更高版本中由 Windows 更新托管的系统组件。 它在所有 Windows 10 及更高版本的操作系统上都可用。 若要将应用程序部署到较早的操作系统,可能还需要重新分发 UCRT。 Visual Studio 可再发行组件文件中包含一个早期版本的 UCRT。 此版本仅安装在 Windows 10 之前的操作系统上,且仅在尚未安装任何版本的 UCRT 的情况下安装。 若要获取能作为 Microsoft 系统更新包安装在下层系统的 UCRT 版本,请参阅 Microsoft 下载中心中的 Windows 10 通用 C 运行时。
无法重新分发 Visual Studio 中包含的所有文件。 只能重新分发在 Redist.txt 或联机“REDIST 列表”中指定的文件。此外,不能重新分发调试版本的应用程序或 Microsoft 提供调试版本的 DLL 或库。 只能将调试可执行文件和库复制到用于测试的计算机。 有关详细信息,请参阅选择部署方法。
下表描述了应用程序可能依赖的一些 Visual C++ DLL。
Visual C++ 库 | 说明 | 适用于 |
---|---|---|
vcruntime[version].dll | 本机代码的运行库 | 。 使用常规 C 和 C++ 语言启用和终止服务的应用程序。 |
vccorlib[version].dll | 托管代码的运行库。 | 使用托管代码的 C++ 语言服务的应用程序。 |
msvcp[version].dll 和 msvcp[version_dotnumber].dll | 本机代码的 C++ 标准库。 | 使用 C++ 标准库的应用程序。 |
concrt[version].dll | 本机代码的并发运行库。 | 使用并发运行时的应用程序。 |
mfc[version].dll | Microsoft 基础类 (MFC) 库。 | 使用 MFC 库的应用程序。 |
mfc[version][language].dll | Microsoft 基础类 (MFC) 库资源。 | 使用 MFC 特定语言资源的应用程序。 |
mfc[version]u.dll | 具有 Unicode 支持的 MFC 库。 | 使用 MFC 库并需要 Unicode 支持的应用程序。 |
mfcmifc80.dll | MFC 托管接口库。 | 使用具有 Windows 窗体控件的 MFC 库的应用程序。 |
mfcm[version].dll | MFC 托管库。 | 使用具有 Windows 窗体控件的 MFC 库的应用程序。 |
mfcm[version]u.dll | 具有 Unicode 支持的 MFC 托管库。 | 使用具有 Windows 窗体控件的 MFC 库并需要 Unicode 支持的应用程序。 |
vcamp[version].dll | 本机代码的 AMP 库。 | 使用 C++ AMP 库代码的应用程序。 |
vcomp[version].dll | 本机代码的 OpenMP 库。 | 使用 C++ OpenMP 库代码的应用程序。 |