本文介绍如何在 Visual C++ 中重新分发共享 C 运行时组件。
原始产品版本: Visual Studio、.NET Framework
原始 KB 数: 326922
总结
在 Microsoft Visual Studio 中生成应用程序时,应用程序使用 C 运行时库(CRT),将相应的 CRT 动态链接库(DLL)从以下列表中分发给应用程序:
- Msvcr90.dll 用于 Microsoft Visual C++ 2008
- 适用于 Microsoft Visual C++ 2005 的 Msvcr80.dll
- 适用于 Microsoft .NET Framework 1.1 的 Microsoft Visual C++ .NET 2003 的 Msvcr71.dll
- Microsoft Visual C++ .NET 2002 和 Microsoft .NET Framework 1.0 使用的 Msvcr70.dll
对于Msvcr70.dll或Msvcr71.dll,应将 CRT DLL 安装到应用程序程序文件目录中。 你可能无法将这些文件安装到 Windows 系统目录中。 对于 Msvcr80.dll 和 Msvcr90.dll,应将 CRT 安装为 Windows 并行程序集。
DLL 冲突
过去,Microsoft作为共享系统组件分发了共享 CRT DLL。 在未安装正确版本的 CRT DLL 的计算机上运行链接到不同版本的 CRT 的应用程序时,可能会导致问题。 它通常称为 DLL 冲突 问题。
若要解决此问题,CRT DLL 不再被视为系统文件,因此将 CRT DLL 与依赖它的任意应用程序一起分发。 由于它不再是系统组件,因此请使用其他特定于应用程序的代码将其安装在应用程序 Program Files 目录中。 这会阻止应用程序使用可能安装在系统路径上的 CRT 库的其他版本。
Visual C++ .NET 2003 或 Visual C++ .NET 2002 在开发系统上的 System32 目录中安装 CRT DLL。 安装是为了给开发人员提供便利。 否则,使用与共享 CRT 链接的 Visual C++ 生成的所有项目均需要在生成目录中保留 DLL 副本,以方便调试和执行。 Visual C++ 2005 和 Visual C++ 2008 将 CRT DLL 作为 Windows 并行程序集安装在 Windows XP 和更高版本的操作系统上。 Windows 2000 不支持并行程序集。 在 Windows 2000 上,CRT DLL 安装在 System32 目录中。
在 CRT DLL 中分发需要共享 CRT 库的应用程序时,建议使用 Visual C++随附的 CRT.msm 合并模块,而不是直接分发 DLL 文件。
Windows 并行程序集
Visual C++ 2005 随 Msvcr80.dll 和 Visual C++ 2008 随 Msvcr90.dll 一起以 Windows 并存程序集的形式重新分发,但不包括 Windows 2000。 可以通过运行 Visual Studio 随附的 Vcredist_x86.exe 应用程序,在目标计算机上安装这些版本的 CRT。 x64 和 IA-64 平台也有安装程序。 相反,可以使用 Visual Studio 提供的 CRT msm 合并模块将 CRT 安装程序打包到自己的安装应用程序中。 这将使 CRT 作为共享程序集提供给所有应用程序,因为它安装在 \windows\winsxs
受支持的操作系统上的目录中。