Visual Studio Installer 部署

使用 Windows Installer 部署,可以创建要分发给用户的安装程序包;用户通过向导来运行安装文件和执行安装步骤,以安装应用程序。 这是通过向解决方案中添加安装项目来实现的。 在生成该项目时,将会创建一个分发给用户的安装文件;用户通过向导来运行安装文件和执行安装步骤,以安装应用程序。

Microsoft Windows Installer 是作为 Windows 操作系统的一部分附带的数据驱动型安装和配置服务。 Windows Installer 维护一个有关安装的每个应用程序的信息(包括文件、注册表项和组件)的数据库。 卸载应用程序时,将检查数据库以确保在移除该应用程序前没有其他应用程序依赖于文件、注册表项或组件。 这样可防止在移除一个应用程序后中断另一个应用程序。

提示

学习版不提供 Windows Installer 技术。 有关学习版中使用的部署技术的信息,请参见 ClickOnce 安全和部署

通过结合使用 Visual Studio 中的部署工具和 Windows Installer 提供的功能,可以部署和维护应用程序。

创建安装程序包

应使用安装程序包来部署应用程序及其系统必备组件。 通常,应用程序依赖于 .NET Framework 和 SQL Server Express,甚至还依赖于某个自定义的 EXE 或 DLL。 但是,无法确定最终用户计算机是否具有 .NET Framework 的特定版本或您的应用程序依赖的其他依赖项。 出于此原因,不建议将您的应用程序复制到最终用户计算机。

安装位置

最终用户可以从网站、CD、网络文件共享或其他备选项安装您的应用程序。 安装位置会影响您可以使用的项目模板。 例如,如果您希望最终用户从网站安装,则可以使用“Web 安装”项目模板。 若要从 CD 或网络安装,则可以使用“安装”项目模板。 有关部署项目模板的更多信息,请参见安装和部署项目

文件和文件夹

可以使用**“文件系统编辑器”控制部署文件的安装位置和安装方式。 不同计算机的文件系统的组织可能不同,文件夹名称也可能不同;“文件系统编辑器”**使用抽象文件夹的概念确保文件安装在您所希望的位置。 有关更多信息,请参见部署中的文件安装管理

虚拟文件夹表示 Windows 系统文件夹。 例如,**“桌面文件夹”相当于“桌面”系统文件夹。 Windows 会跟踪系统文件夹的位置,因此无论文件夹的位置或名称如何,放置在“桌面文件夹”**中的文件最后始终位于“桌面”系统文件夹中。 有关更多信息,请参见“特殊”文件夹和“自定义”文件夹

您还可以创建自己的文件夹并将它们放在任何系统文件夹下的位置中。 例如,可以在**“应用程序文件夹”下创建“应用程序数据”文件夹,这样不论“应用程序文件夹”**位于目标计算机上的什么位置,放置在“应用程序数据”文件夹中的文件都始终安装在同一相对位置。 有关更多信息,请参见 如何:在文件系统编辑器中添加和移除文件夹

**“文件系统编辑器”**中的文件夹可以包含文件、项目输出和程序集。 项目输出表示解决方案中另一个项目所包含的项,并且可以包含以下内容:主要的生成输出(如可执行文件)、本地化资源、符号调试信息、内容文件(如 HTML 页)和项目源文件。 其中的每个输出都称为项目输出组,项目输出组包含主要输出(也称为键输出)和任何附加的输出与依赖项。 有关更多信息,请参见如何:在文件系统编辑器中添加和移除项目输出如何:向部署项目中添加项

另外,可以使用 Condition 属性在任何文件或文件夹上放置条件。 这使您得以在安装过程中根据目标计算机上的条件自定义文件的安装。 例如,可以根据目标计算机上操作系统的版本来选择安装不同的文件。 有关更多信息,请参见 Condition 属性

**“文件系统编辑器”**还支持快捷方式的创建,这样,您可以将文件放置在一个文件夹中,然后从桌面或另一文件夹中的快捷方式指向这些文件。 有关更多信息,请参见如何:在文件系统编辑器中添加和移除快捷方式

文件关联

当部署某个应用程序时,经常需要将一个文件类型与该应用程序关联。 例如,如果您的应用程序创建并使用扩展名为 .myfile 的文件,则您可能希望将该应用程序与 .myfile 文件类型关联,以便用户双击 .myfile 文件时,它会在该应用程序中打开。

Visual Studio 中的部署工具包括**“文件类型编辑器”**,您可以使用此编辑器来指定文档类型并将其与文件扩展名关联。 另外,可以为每个文档类型指定谓词或操作,并为浏览器中使用的文档类型指定 MIME 类型。 有关更多信息,请参见部署中的文件类型管理

安装过程中,在**“文件类型编辑器”**中指定的设置将会在目标计算机上更新。

注册表

部署应用程序不可缺少的组成部分常常涉及访问注册表、设置注册表值或创建注册表项。 Visual Studio 中的部署工具提供了此功能。

Visual Studio 中的**“注册表编辑器”**类似于 Windows 注册表编辑器:两种工具都提供目标计算机上注册表的分层表示形式, 并显示标准的注册表根。 可以更改现有项的值或者添加新项的值,还可以指定默认项。 有关更多信息,请参见部署中的注册表设置管理

安装过程中,在**“注册表编辑器”**中指定的项和值将写入到目标计算机的注册表。

另外,可以使用**“Condition”**属性在任何注册表项或值上放置条件。 这使您得以在安装过程中根据目标计算机上的条件自定义注册表。 例如,您可能希望根据目标计算机上的操作系统版本输入不同的注册表值。

Authenticode 签名

您可能需要为应用程序或组件签名,以便用户可以验证它的发布者以及它的安全性。 建议您为通过 Web 浏览器下载的 Cab 文件和安装程序签名。

可以使用 Visual Studio 部署工具来利用 Microsoft Authenticode 技术对安装程序、合并模块或 Cab 文件进行签名。 必须首先获得数字证书才能为应用程序或组件签名。

若要使用 Authenticode 签名,必须启用部署项目中已签名的 ClickOnce 清单。 有关更多信息,请参见“项目设计器”->“签名”页

全局程序集缓存

全局程序集缓存是一个由 .NET Framework 提供的代码缓存,用于存储需要由几个应用程序共享的程序集。 若要在全局程序集缓存中安装程序集,程序集必须是强命名的,这可以赋予应用程序或组件一个唯一标识,以便其他软件可用该标识来显式地标识和引用该应用程序或组件。 有关更多信息,请参见如何:对程序集进行签名 (Visual Studio)

若要将程序集安装到全局程序集缓存中,应将该程序集或其项目输出组添加到**“文件系统编辑器”“Global Assembly Cache”文件夹中。 若要打开此编辑器,请在“视图”菜单上指向“编辑器”,并依次单击“文件”“系统”“编辑器”**。

**“Global Assembly Cache”文件夹不同于“文件系统编辑器”**中的其他文件夹。 它没有可设置的属性,并且您无法创建到该文件夹或该文件夹中的程序集的快捷方式。

选择系统必备组件

若要成功部署应用程序,还必须部署该应用程序引用的全部组件。 例如,使用 Visual Studio 创建的大多数应用程序都依赖 .NET Framework。 安装应用程序之前,目标计算机上必须存在必需的公共语言运行时版本。 使用 Visual Studio 中的部署工具,可以将 .NET Framework 和其他组件作为安装的一部分进行安装。 安装系统必备组件的过程又称为“引导”。

有关更多信息,请参见如何:在 Windows Installer 部署中安装系统必备组件

使用管理特权进行安装

管理员安装是 Microsoft Windows Installer 的一项功能,使您可以在网络共享上安装应用程序的源映像。 然后,工作组中拥有网络共享访问权限的用户就可以从该源映像安装应用程序。

可以使用**“用户界面编辑器”**来指定一组不同的安装对话框。当管理员通过使用带有 /a 命令行选项的命令行(msiexec /a安装程序名称),将应用程序安装到一个网络共享时,将会显示这些安装对话框。 有关更多信息,请参见部署中的用户界面管理

提示

当通过管理安装来安装应用程序时,引导应用程序文件(需要时,用于安装 Windows Installer 的文件)不会复制到服务器上,即使“Bootstrapper”属性设置为“Windows Installer 引导程序”也是如此。 如果引导性应用程序文件是安装时所必需的,则需要将文件 Instmsia.msi、Instmsiw.msi、Setup.exe 和 Setup.ini 手动复制到服务器上。 这些文件可在应用程序的 .msi 文件所在的目录中找到。

有关更多信息,请参见管理员安装 (Windows Installer) 中的 Windows Installer SDK 文档。

Windows 和提升

Windows Installer 技术支持将软件安装到 Windows Vista 和 Windows 7 操作系统上。 安装应用程序的最终用户只会收到每个需要提升权限的组件安装的相应提示,即使该用户的计算机在用户帐户控制 (UAC) 下运行也是如此。

应用程序提升

通常,Setup.exe(又称为“引导程序”)不会以提升的权限级别运行,而是以当前用户的权限级别运行。 因此,当开始安装最后一个应用程序时,安装不会提示您以提升的权限运行。 但是,请注意 .msi 文件通常会提示用户,而 Setup.exe 则不提示。

在引导程序的嵌入式 UAC 清单中,requestedExecutionLevel 节点指定安装程序应以当前用户的身份 (asInvoker) 运行:

<requestedExecutionLevel level="asInvoker" />

但是,如果有必要,您可以提升应用程序的安装权限。 例如,在 Web 安装项目中修改 Internet 信息服务 (IIS) 设置需要管理特权,这与将程序集安装到全局程序集缓存中一样。 提升提示出现在安装系统必备组件之后、安装应用程序之前。

若要提升安装权限,请打开项目 (.vdproj) 文件。 在项目文件的 MsiBootstrapper 部分中,请将 RequiresElevation 属性设置为 True。 此属性不能通过 Visual Studio 集成开发环境 (IDE) 使用。 因此您必须使用项目文件。 有关更多信息,请参见 RequiresElevation 属性

管理员协助提升

Windows Installer 支持 Windows Vista 和 Windows 7 上的管理员协助提升功能。 在该方案中,系统会提示用户输入管理员凭据,管理员将为用户输入密码。 为了支持该方案,当计算机运行的是 Windows Vista 或更高版本的 Windows 时,引导程序会将 AdminUser 属性设置为 True。

提示

如果您在未使用 UAC 的计算机上运行 Windows Vista,并且您不是管理员,那么,AdminUser 仍将设置为 True。 因此,应将 .exe 安装程序(如 SQLExpress32.exe)编写为检测适当的权限,并在权限不足的情况下生成一个特定的退出代码。 您应当将 Setup.exe 编写为捕捉该退出代码,并显示一则声明需要管理员权限的消息。

系统必备组件提升

Windows Vista 和 Windows 7 会在必要时提升系统必备组件的安装权限。 引导程序本身并不执行权限提升;当 Windows Vista 或 Windows 7 在 UAC 下运行时,它会针对每个必须提升权限的系统必备组件发出一个提示(除非已经安装相应的组件)。 如果程序包提升失败,则引导程序会失败并发送一则相应的错误消息。

自定义操作提升

在自定义操作编辑器中创建的自定义操作以提升的权限运行。 自定义操作不应访问用户特定数据(如注册表或文件系统),因为自定义操作将不在调用用户的帐户下运行。

默认情况下,自定义操作以提升的权限运行,因为自定义操作编辑器中 NoImpersonate 属性的默认设置为 True。 将 NoImpersonate 更改为 False 会强制自定义操作模拟调用用户,调用用户可能具有减少的权限。

Visual Studio 版本之间的区别

另请注意,Visual Studio 2005 安装项目和 Visual Studio 2008 安装项目在 UAC 下的运行方式将有所不同。

当您在 UAC 下运行时,Windows Vista 或 Windows 7 中内置的安装程序检测功能会提示您是否同意。 使用 Visual Studio 2005 生成的引导程序 (Setup.exe) 总是询问您是否同意安装,而不管安装的内容是什么。 由于 Setup.exe 及其所有进程在 Windows Vista 和 Windows 7 上运行时都会使用管理员令牌,因此最终应用程序安装将以提升的特权进行。 如果用户使用管理员协助提升功能运行 Setup.exe,则应用程序安装在提升用户的配置文件(而非管理员的配置文件)下。

在 Visual Studio 2008 和 Visual Studio 2010 中,Setup.exe 在启动时不会提示用户进行权限提升。 为了防止出现提升提示,引导程序的嵌入式清单指定 Setup.exe 应以请求的 asInvoker 执行级别运行。 尽管这仍会在必要时提升权限来安装系统必备组件,但是,它提供了一个优点,即最终的应用程序安装将不会以提升权限运行。 引导程序调用 ShellExecute 来启动系统必备组件。 Windows Vista 或 Windows 7 接收此调用,执行安装检测,并在安装之前向用户发出提示。

此变更的缺点在于,除了应用程序本身之外,还会针对每个必须安装的系统必备组件发出一个提示。 但是,如果计算机已安装所有系统必备组件,则安装可能不会导致出现任何提示。 此外,您不能执行需要提升权限的外部检查。 外部检查将正常工作,但是,除针对安装程序本身的提示外,用户还将在每次执行外部检查时收到数个提升提示。

请参见

任务

安装和部署项目的疑难解答

参考

部署错误和支持

概念

安装和部署项目

其他资源

部署应用程序和组件

部署编辑器

部署任务和演练

部署对话框

部署示例和演练