选择部署方法
更新:2007 年 11 月
大多数情况下,Visual C++ 应用程序的部署都是用 Windows Installer 部署来完成的。有关 Visual Studio 内支持的部署方法以及替换方法的更多信息,请参见选择部署策略和其他部署方法。在 Visual Studio 2005 中,不支持 Visual C++ 本机应用程序的 ClickOnce 部署;但是,可以在命令行上通过 ClickOnce 部署 Visual C++ 应用程序。有关更多信息,请参见 Visual C++ 应用程序的 ClickOnce 部署。
Visual C++ 库是并行程序集
Visual Studio 2005 将 Visual C++ 库安装为共享并行程序集。默认情况下,用 Visual Studio 2005 生成的所有应用程序都生成为带有清单(作为资源嵌入或作为外部文件伴随最终二进制文件)的独立应用程序。为了确保 Visual C++ 应用程序能在未安装 Visual C++ 的计算机上运行,可能必须与该应用程序一起重新发布 Visual C++ 程序集并确保它们安装在目标计算机上。
重新发布 Visual C++ 库
有三种方法可重新发布 Visual C++ DLL:
使用 Visual C++ 可再发行的合并模块将特定 Visual C++ 库作为共享并行程序集安装到本机程序集缓存(WinSxS 文件夹)中。这是重新发布 Visual C++ 库的主要推荐方法。 访问此文件夹要求 Installer 应用程序由具有管理员权限的用户来运行。有关更多信息,请参见使用合并模块重新发布。有关此部署的示例可参见如何:部署“安装和部署项目”。
使用 Visual C++ 可再发行组件包(VCRedist_x86.exe、VCRedist_x64.exe、VCRedist_ia64.exe)将所有 Visual C++ 库作为共享并行程序集安装到本机程序集缓存(WinSxS 文件夹)中。此组件包由 Visual Studio 安装到 %WindowsSdkDir%\Bootstrapper\Packages\ 文件夹中,也可以从 Microsoft 下载网站 Microsoft Visual C++ 2005 Redistributable Package (x86)(Microsoft Visual C++ 2005 可再发行组件包 (x86))下载。对于用 Visual C++ 速成版生成的应用程序以及需要立即部署所有 Visual C++ 库的情况,建议使用此组件包重新发布 Visual C++ 库。有关如何使用此组件包的示例,请参见如何:使用 XCopy 进行部署。
使用 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件将特定 Visual C++ 程序集作为应用程序的私有程序集安装。允许没有管理员权限的用户安装应用程序或可以通过共享运行应用程序时,建议使用这种方法。有关示例,请参见如何:使用 XCopy 进行部署。
说明: |
---|
在 Windows Server 2000 上,要重新发布 Visual C++ 库,只能使用所建议的受支持的方式,即,通过使用可再发行的合并模块。 |
当使用可再发行的合并模块安装 Visual C++ 库时,程序集将作为共享的并行程序集部署到本机程序集缓存(WinSxS 文件夹)中。访问此文件夹要求 Installer 应用程序由具有管理员权限的用户来运行。
如果安装由不具备管理权限的用户运行,则安装将无法部署 Visual C++ 程序集,而且应用程序将无法运行。同样,某些产品可能允许基于每个用户进行安装,但是合并模块会将库安装到共享位置中并影响系统的所有用户。对于这两个方案及类似的方案,受支持的技术是将必需的程序集作为特定用户的应用程序的私有并行程序集安装。
使用此技术,就可以将具有 DLL 和依赖程序集清单的文件夹复制到应用程序的本地文件夹。当执行应用程序时,操作系统的加载程序仍首先在 WinSxS 文件夹中查找依赖程序集;但是,当无法找到相应的程序集时,该加载程序会从该子目录中加载私有程序集。
重新发布 Visual C++ 库不正确可能导致执行依赖于这些库的应用程序时出现运行时错误。有关可能发生的错误和这些错误的解决方法的列表,请参见 C/C++ 独立应用程序和并行程序集疑难解答。
必需的清单
不支持重新发布在没有清单的情况下生成的 C/C++ 应用程序。如果没有将 C/C++ 应用程序绑定到 Visual C++ 库的清单,这些库就不能由该应用程序使用。在 Visual C++ 2005 中生成的所有 C/C++ 二进制文件必须包含描述 Visual C++ 库上的依赖项的清单。这是 Visual Studio 中项目的默认安装以及链接器根据对象代码生成最终二进制文件的默认行为。
建议在任何情况下该清单都是内部清单。但如果是 EXE 文件,则该清单可以是外部清单(支持这种方案但不建议使用)。
如果应用程序要求依赖 DLL 位于应用程序本地文件夹中或者由环境变量指示的文件夹中,则还会容易受到与安全有关的利用的攻击。在部署这样的应用程序之后,为其提供服务会更困难。
使用动态链接(而非静态链接)
不建议重新发布静态链接到 Visual C++ 库的 C/C++ 应用程序。通常错误地认为,将程序静态地链接到 Visual C++ 库可以显著改善应用程序的性能。但是,在几乎所有的情况下,动态加载 Visual C++ 库对性能造成的影响并不显著。而且,静态链接不允许应用程序的作者或 Microsoft 为应用程序及其依赖库提供服务。例如,假定静态连接到特定库的应用程序在具有此库的新版本的客户端计算机上运行。应用程序仍可以从该库的以前版本使用代码,但不会受益于库增强功能(如安全增强功能)。强烈建议 C/C++ 应用程序的作者在决定静态链接到依赖库之前认真考虑维护方案,并尽可能使用动态链接。