部署是分发要安装到其他计算机上的已完成应用程序或组件的过程。部署是一个多阶段过程,该过程从在开发人员的计算机上创建应用程序开始,到应用程序安装后并准备在用户的计算机上运行结束。
Visual Studio 为部署 Windows 应用程序提供两种不同的技术:ClickOnce 部署或 Windows Installer 部署。
ClickOnce 可用于部署针对公共语言运行时(混合程序集、纯程序集和可验证程序集)的 C++ 应用程序。您还可以使用 Windows Installer 部署托管应用程序,但 ClickOnce 利用了 .NET Framework 安全功能(如清单签名)的优点,因此,它优于 Windows Installer 部署。ClickOnce 不支持部署本机 C++ 应用程序。
Windows Installer 技术可用于部署针对公共语言运行时的本机 C++ 应用程序和 C++ 应用程序。
C++ 中的 Windows Installer 部署
Visual C++ 项目通常使用传统的 Windows Installer 安装进行部署。若要准备部署 Windows Installer,需要将应用程序打包到 setup.exe 文件中,并将该文件与安装程序包 (.msi) 一起分发。用户随后可以运行 setup.exe 来安装应用程序。
应用程序的打包是通过将安装项目添加到解决方案来实现的:当生成时,将创建分发给用户的安装和安装程序包文件。有关更多信息,请参见选择部署方法。
当使用 Visual C++ 库提供的功能生成 C/C++ 应用程序时,该应用程序在运行时将依赖于那些库的存在。为了让应用程序运行,它必须以静态或动态方式链接到必需的 Visual C++ 库。如果应用程序动态链接到某个 Visual C++ 库,则在运行应用程序时,该库必须存在以便可以加载它。另一方面,如果应用程序静态链接到某个 Visual C++ 库,则它不要求在用户的计算机上存在相应的 DLL。但是,静态链接具有某些负面影响,如增加应用程序文件的大小并使得维护有可能更难进行。
打包和重新发布
Visual C++ 库以 DLL 形式打包,C/C++ 应用程序所有必需的库都由 Visual Studio 安装在开发人员的计算机上。但在将应用程序部署到用户时,要求他们为了运行您的应用程序而安装 Visual Studio,这在大多数情况下是不可行的。这使得仅重新发布应用程序正确运行所需的 Visual C++ 的部分变得非常重要。
确定您的应用程序依赖哪些 Visual C++ 库的一种方法是:查看您项目的“属性页”对话框中的“常规”选项卡。例如,您可能看到项目使用的是 MFC 和 ATL 库。如果选择了“在动态库中使用 MFC”,则您的应用程序在运行时依赖 MFC DLL(如 mfc90.dll)。如果您的应用程序不使用 MFC 或 ATL,它可能仍依赖 CRT 库(如果已在“配置属性”的 C/C++ 分支中的“代码生成”选项卡上为“运行库”选择了“多线程调试 DLL (/MDd)”)。
确定您的应用程序依赖哪些 DLL 的最全面的方式是:使用依赖项查看器 (depends.exe) 打开该应用程序。您可以从 http://www.dependencywalker.com 下载 Dependency Walker。
通过使用 depends.exe 或具有 /DEPENDENTS 选项的 DUMPBIN 实用工具,可以查看静态链接到您的应用程序的 DLL 的列表,以及应用程序的延迟加载的 DLL 的列表。
若要查看哪些 DLL(如 ActiveX 控件)是动态加载的,请使用 depends.exe 的分析功能。然后,测试您的应用程序,直到您确信所有代码路径都已执行。在结束分析会话时,Depends.exe 将显示哪些 DLL 是动态加载的。
在使用 Depends.exe 时,要注意,DLL 可能有关于另一个 DLL 或特定 DLL 版本的依赖项。可以在开发计算机上或目标计算机上使用 Depends.exe。在开发计算机上,Depends.exe 将报告支持应用程序所需要的 DLL。如果在让应用程序在目标计算机上运行时遇到问题,可以将 depends.exe 复制到目标计算机上,然后在 depends.exe 中打开该应用程序。depends.exe 将报告应用程序的哪些 DLL 不存在,或者虽然存在,但版本不正确。
在您有了应用程序所依赖的 DLL 的完整列表后,就可以决定其中哪些 DLL 在部署到其他计算机时必须与您的应用程序一起重新发布。在多数情况下,没必要重新发布系统 DLL,但是可能必须重新发布 Visual C++ 库的 DLL。
确定需要与应用程序一起重新发布的文件的第一步是:清楚地了解此应用程序的依赖项并收集依赖 DLL 的列表(例如,通过使用如 理解 Visual C++ 应用程序的依赖项 中所描述的依赖项查看器 (depends.exe))。
当使用 DUMPBIN 或 depends.exe 查看您的依赖项时,请使用 Redist.txt 中的文件列表查看应用程序所依赖的哪个 DLL 是 Microsoft 提供的 DLL(Visual Studio 的一部分)。Redist.txt 位于 Program Files\Microsoft Visual Studio 2010 目录中。下面是应用程序可能依赖的 Visual C++ 文件的列表。但是,只有在 Redist.txt 中指定的文件才能随应用程序一起重新发布。请注意,应用程序的调试版本是不可重新发布的,而且各种 Visual C++ 动态链接库 (DLL) 的调试版本也都是不可重新发布的。有关其他信息,请参见选择部署方法。
Visual C++ 库 |
说明 |
适用对象 |
---|---|---|
atl100.dll |
活动模板库 (ATL)。 |
使用 ATL 的应用程序。 |
msvcr100.dll |
面向本机代码的 C 运行库 (CRT)。 |
使用 C Run-Time Libraries的应用程序。 |
msvcm100.dll |
面向托管代码和混合代码的 CRT 和标准 C++ 库。 |
使用 C Run-Time Libraries或标准 C++ 库并使用 /clr(公共语言运行时编译)编译器选项的应用程序。 |
msvcp100.dll |
面向本机代码的标准 C++ 库。 |
使用标准 C++ 库的应用程序。 |
mfc100.dll |
Microsoft 基础类 (MFC) 库。 |
使用 MFC 库的应用程序。 |
mfc100u.dll |
具有 Unicode 支持的 MFC 库。 |
使用 MFC 库并需要 Unicode 支持的应用程序。 |
mfcmifc100.dll |
MFC 托管接口库。 |
使用具有 Windows 窗体控件的 MFC 库的应用程序。 |
mfcm100.dll |
MFC 托管库。 |
使用具有 Windows 窗体控件的 MFC 库的应用程序。 |
mfcm100u.dll |
具有 Unicode 支持的 MFC 托管库。 |
使用具有 Windows 窗体控件的 MFC 库并需要 Unicode 支持的应用程序。 |
有关如何随应用程序重新发布这些 DLL 的其他信息,请参见重新分发 Visual C++ 文件。有关示例,请参见部署示例。
通常,您不需要重新发布系统 DLL(例如 Kernel32.dll、User32.dll、Ole32.dll 或 ShDocVW.dll),因为这些 DLL 是操作系统的一部分,并存在于任何安装相同版本的操作系统的计算机上。但是,可能存在例外,如应用程序将在几个版本的 Microsoft 操作系统上运行的情况下。如果有这样的需求,要确保阅读相应的许可协议。如有可能,应尝试通过 Microsoft 提供的 Service Pack 或小的可再发行组件包,来将系统 DLL 升级。可以从 MSDN Library 或 http://support.microsoft.com 上的知识库文章中搜索和标识任何此类可用的软件包。
大多数情况下,Visual C++ 应用程序的部署都是用 Windows Installer 部署来完成的。有关 Visual Studio 内支持的部署方法以及替换方法的更多信息,请参见选择部署策略和Deployment Alternatives。在 Visual Studio 2010 中,不支持 Visual C++ 本机应用程序的 ClickOnce 部署;但是,可以在命令行上通过 ClickOnce 部署 Visual C++ 应用程序。有关更多信息,请参见 Visual C++ 应用程序的 ClickOnce 部署。
Visual Studio 2010 将 Visual C++ 库作为共享 DLL 安装在 %windir%\system32 目录中。为了确保 Visual C++ 应用程序将在未安装 Visual C++ 的计算机上运行,您可能必须与该应用程序一起重新发布 Visual C++ DLL 并确保它们安装在目标计算机上。
有三种方法可重新发布 Visual C++ DLL:
我们建议您使用 Visual C++ 可再发行组件包(VCRedist_x86.exe、VCRedist_x64.exe 和 VCRedist_ia64.exe)将所有 Visual C++ 库作为共享 DLL 安装在 %windir%\system32 中。Visual Studio 会将此组件包安装在 %WindowsSdkDir%\Bootstrapper\Packages 文件夹中;您也可以从 Microsoft Download Center下载此组件包。我们建议您对通过 Visual C++ 学习版生成的应用程序使用此组件包,以及当希望同时部署所有 Visual C++ 库(不仅仅是其一个子集)时也使用此组件包。有关如何使用此组件包的示例,请参见演练:使用 Visual C++ 可再发行组件包部署 Visual C++ 应用程序。
使用 Visual C++ 可再发行合并模块将特定的 Visual C++ 库作为共享 DLL 安装在 %windir%\system32 中。访问此文件夹要求 Installer 应用程序由具有管理员权限的用户来运行。有关更多信息,请参见使用合并模块重新分发。有关此部署的示例可参见演练:使用安装项目部署 Visual C++ 应用程序。
使用提供的文件将与应用程序位于同一文件夹中的特定 Visual C++ DLL 安装在 Program Files\Microsoft Visual Studio 10.0\VC\Redist 目录中。允许没有管理员权限的用户安装应用程序或可以通过共享运行应用程序时,建议使用这种方法。
使用可再发行合并模块安装 Visual C++ 库时,DLL 将作为共享 DLL 部署到 %windir%\system32 中。访问此文件夹要求 Installer 应用程序由具有管理员权限的用户来运行。
如果安装由不具备管理权限的用户运行,则安装将无法部署 Visual C++ DLL,并且应用程序将无法运行。同样,某些产品可能允许基于每个用户进行安装,但是合并模块会将库安装到共享位置中并影响系统的所有用户。在这两种情况下以及类似的情况下,支持将所需的 DLL 安装在特定用户的应用程序目录中这一技术。
利用此技术足以将 DLL 复制到应用程序的本地文件夹中。执行应用程序时,操作系统的加载程序使用 LoadLibraryEx 中所述的搜索顺序。
错误地重新发布 Visual C++ 库可能会导致执行依赖于这些库的应用程序时出现运行时错误。
不建议重新发布静态链接到 Visual C++ 库的 C/C++ 应用程序。通常错误地认为,将程序静态地链接到 Visual C++ 库可以显著改善应用程序的性能。但是,在几乎所有的情况下,动态加载 Visual C++ 库对性能造成的影响并不显著。而且,静态链接不允许应用程序的作者或 Microsoft 为应用程序及其依赖库提供服务。例如,假定静态连接到特定库的应用程序在具有此库的新版本的客户端计算机上运行。应用程序仍可以从该库的以前版本使用代码,但不会受益于库增强功能(如安全增强功能)。强烈建议 C/C++ 应用程序的作者在决定静态链接到依赖库之前认真考虑维护方案,并尽可能使用动态链接。
当使用 Visual C++ 开发应用程序时,会具有这样的优势:您工作所用的计算机不仅是良好的开发环境,而且也是运行和测试应用程序的方便环境。但是,当您希望将应用程序部署到其他计算机上时,必须重新发布在目标系统上支持该应用程序所需要的所有文件。仅有某些 Visual C++ 文件可以与您的应用程序一起重新发布。请查看 Visual Studio 2010 的 Microsoft 软件许可条款和 Redist.txt 文件,以了解可以与应用程序一起重新发布哪些文件。EULA.txt 在第一张产品 CD 或 DVD 上的 \Setup 目录中,而 Redist.txt 位于第二张 CD 或 DVD 上的 Program Files\Microsoft Visual Studio 2010 目录中。
可以通过以下方法重新发布 Visual C++ 文件:使用提供的可再发行合并模块或 Visual C++ 可再发行组件包,或者将特定 Visual C++ DLL 部署到应用程序本地文件夹中。
说明 |
---|
应用程序本地文件夹是包含应用程序可执行文件的文件夹。必须在应用程序本地文件夹中部署 DLL。 |
在第一种情况下,具有特定 Visual C++ DLL 的合并模块必须包含在一个 Windows Installer 程序包中或用于将此应用程序部署到其他计算机的类似安装软件包中。在目标系统上必须执行 Visual C++ 可再发行组件包(VCRedist_x86.exe、VCRedist_x64.exe、VCRedist_ia64.exe)���作为安装应用程序的必备条件。此组件包安装和注册所有 Visual C++ 库。
说明 |
---|
对于用 Visual C++ 学习版生成的应用程序以及需要同时部署所有 Visual C++ 库的情况,建议使用此组件包重新发布 Visual C++ 库。 |
如果 Visual C++ 库 DLL 不可访问,Windows 无法为应用程序加载此 DLL,则您可能收到以下错误消息:
没有找到 MSVCR100.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。
若要更正这些错误,必须确保正确生成应用程序,并且将 Visual C++ 库正确部署到目标系统中。
描述如何使用安装项目部署 Visual C++ 应用程序。
使用“MFC 应用程序向导”创建新的 Visual Studio 解决方案。若要查找该向导,请从“新建项目”对话框中,展开“Visual C++”节点,选择“MFC”,再选择“MFC 应用程序”,输入项目的名称,然后单击“确定”。
将活动解决方案配置更改为“发布”。从“生成”菜单中,选择“配置管理器”。从“配置管理器”对话框的“活动解决方案配置”下拉框中选择“发布”。
按 F7 以生成该应用程序。或者,在“生成”菜单上,单击“生成解决方案”。这样,安装项目可以使用“MFC 应用程序”项目的输出。
使用“安装项目”模板将名为 Setup1 的新安装项目添加到解决方案中。若要查找该模板,请从“新建项目”对话框中展开“其他项目类型”节点,再展开“安装和部署”,选择“Visual Studio Installer”节点,再单击“安装项目”。从“解决方案”下拉框中选择“添加到解决方案”,再单击“确定”。
将 MFC 应用程序项目的输出添加到安装项目。若要执行此操作,请在“解决方案资源管理器”中右击 Setup1,指向“添加”,再单击“项目输出”。
在“添加项目输出组”对话框中,选择“主输出”。
从“配置”下拉框中选择“发布 Win32”,再单击“确定”。
在“解决方案资源管理器”中展开 Setup1 节点,然后右击“检测到的依赖项”节点。然后单击“刷新依赖项”。
Visual Studio 会将 Visual C++ 库依赖的合并模块 (.msm) 文件添加到此安装项目中。
生成此安装项目以创建安装程序文件(Setup1.msi 和 setup.exe)。若要执行此操作,请在“解决方案资源管理器”中右击 Setup1 项目节点,然后选择“生成”。
Visual Studio 将在安装项目的 Release 文件夹中创建安装程序文件。
在没有 Visual C++ 库的另一台计算机上运行该安装程序。
将 Setup1.msi 和 setup.exe 复制到第二台计算机上。
在第二台计算机上运行 setup.exe。按照安装向导提示的步骤完成安装。
二。
您需要以下组件来完成本演练:
安装有 Visual Studio 2010 的计算机。
另一台没有 Visual C++ 库的计算机。
通过执行演练:使用安装项目部署 Visual C++ 应用程序中的步骤 1 至 3 来创建和生成新 MFC 应用程序。
将 MFC 和 C 运行库 (CRT) 库文件、mfc100u.dll 和 msvcr100.dll 复制到 MFC 项目的 Release 文件夹中。这些库文件位于 Program Files 文件夹下的 Microsoft Visual Studio 10.0\VC\redist\x86 文件夹中。
在没有 Visual C++ 库的另一台计算机上运行该应用程序。
将 Release 文件夹的内容复制到第二台计算机上。
在第二台计算机上运行 MFC 应用程序。
此应用程序运行成功,因为可以在应用程序本地文件夹中使用 Visual C++ 库。
三。
您需要以下组件来完成本演练:
安装有 Visual Studio 2010 的计算机。
另一台没有 Visual C++ 库的计算机。
通过执行演练:使用 Visual C++ 可再发行组件包部署 Visual C++ 应用程序中的过程的步骤 1 至 3 来创建和生成新 MFC 应用程序。
创建一个名为 setup.bat 的文件并添加以下命令。您需要将 MyMFCApplication 更改为在步骤 1 中使用的项目的名称。
执行下列步骤以创建自解压缩安装文件:
从命令窗口或“运行”窗口运行 iexpress.exe。
选择“创建新的自解压缩指令文件”,然后单击“下一步”。
选择“提取文件并运行安装命令”,然后单击“下一步”。
在文本框中输入 MFC 应用程序的名称,然后单击“下一步”。
在“确认提示”页上,选择“无提示”,然后单击“下一步”。
在“许可协议”页上,选择“不显示许可证”,然后单击“下一步”。
在“打包的文件”页上,添加以下文件,再单击“下一步”:
您的 MFC 应用程序 (.exe)。
vcredist_x86.exe。您可以在 Program Files 文件夹���的 \Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86 文件夹中找到此文件。
在步骤 2 中创建的 setup.bat 文件。
在“安装要启动的程序”页上的“安装程序”文本框中输入以下内容,然后单击“下一步”:
在“显示窗口”页上,选择“默认”,然后单击“下一步”。
在“完成的消息”页上,选择“无消息”,然后单击“下一步”。
在“包名称和选项”页上,输入自解压缩安装文件的名称,确保选择“在包内使用长文件名存储文件”选项,然后单击“下一步”。文件名必须以 Setup.exe 结尾(例如 MyMFCApplicationSetup.exe)。
在“配置重新启动”页上,选择“不重新启动”,然后单击“下一步”。
在“保存自解压缩指令”页上,选择“保存自解压缩指令(SED)文件”,然后单击“下一步”。
在“创建包”页上,单击“下一步”。
在没有 Visual C++ 库的另一台计算机上运行该自解压缩安装文件。
将步骤 3 中创建的自解压缩安装文件复制到第二台计算机上。
在第二台计算机上运行该自解压缩安装文件。按照安装向导提示的步骤完成安装。
运行 MFC 应用程序。该自解压缩安装文件将安装位于步骤 2 中所指定的文件夹内的 MFC 应用程序。
该应用程序将会成功运行,因为自解压缩安装文件中包含 Visual C++ 可再发行组件包安序。
Visual Studio 提供了两种不同技术用来部署 Windows 应用程序:ClickOnce 部署和 Windows Installer 部署。
Visual C++ 部署环境不直接支持使用 ClickOnce 部署 Visual C++ 项目,但提供了使用它的工具。
说明 |
---|
Visual Studio 在 Visual C# 和 Visual Basic 开发环境中支持 ClickOnce。如果您的 Visual C++ 项目是 Visual C# 项目的依赖项,则可以从 Visual C# 开发环境中使用 ClickOnce 部署发布该应用程序(包括其依懒项)。 |
若要使用 ClickOnce 部署 Visual C++ 应用程序,首先必须使用 Mage.exe(清单生成和编辑工具) 或其图形用户界面版本(有关信息,请参见MageUI.exe(图形化客户端中的清单生成和编辑工具))生成 ClickOnce 应用程序清单和 ClickOnce 部署清单。
首先使用 Mage.exe 生成应用程序清单;其结果文件具有扩展名 .manifest。然后使用 Mage.exe 生成部署清单;其结果文件具有扩展名 .application。然后对清单签名。
应用程序清单必须指定目标处理器(“x86”、“x64”或“Itanium”)。有关这些选项的信息,请参见 部署 64 位应用程序。
此外,应用程序和部署清单的名称必须不同于 C++ 应用程序的名称。这样可避免由 Mage.exe 创建的应用程序清单与作为 C++ 应用程序一部分的外部清单之间发生冲突。
您的部署将需要安装应用程序所依赖的所有 Visual C++ 库。要确定特定应用程序的依赖项,可以使用 depends.exe 或带有 /DEPENDENTS 选项的 DUMPBIN 实用工具。有关依赖项的更多信息,请参见 理解 Visual C++ 应用程序的依赖项。您可能需要运行 VCRedist.exe;此实用工具在目标计算机上安装 Visual C++ 库。
您可能还需要为应用程序生成引导程序(必备安装程序)以部署必备组件;有关引导程序的信息,请参见 创建引导程序包。
有关此技术的更为详细的说明,请参见 ClickOnce 安全和部署。有关 ClickOnce 部署的详细示例,请参见演练:手动部署 ClickOnce 应用程序