VB
VB学习者的乐园

本章内容:

作为一名应用程序开发人员,您一定了解部署应用程序的难度。正因为如此,当您在 Microsoft Visual Studio 2005 中看到用于部署应用程序的新工具和改进的工具时,会感到无比惊喜。在本章中,您将特别专注于如何使用新的 ClickOnce 部署技术。而且还将回顾如何使用 Visual Studio 2005 中包含的设置项目模板和工具来构建 Microsoft Windows Installer 包。同时,作为一名 Microsoft Visual Basic .NET 应用程序开发人员,您还将学习在面对各种特定情况时,如何选择正确的方法来部署应用程序。

*
本页内容
应用程序:使用 ClickOnce 进行用户启动的更新 应用程序:使用 ClickOnce 进行用户启动的更新
新概念 新概念
背景 背景
代码访问安全性 代码访问安全性
ClickOnce 的优点 ClickOnce 的优点
发布 ClickOnce 应用程序 发布 ClickOnce 应用程序
安装和运行 ClickOnce 应用程序 安装和运行 ClickOnce 应用程序
更新 ClickOnce 应用程序 更新 ClickOnce 应用程序
配置 ClickOnce 属性 配置 ClickOnce 属性
ClickOnce 安全性 ClickOnce 安全性
运行在沙箱中的 ClickOnce 应用程序 运行在沙箱中的 ClickOnce 应用程序
配置 ClickOnce 代码访问安全性 配置 ClickOnce 代码访问安全性
权限计算器 权限计算器
在安全区域中进行调试 在安全区域中进行调试
提升权限 提升权限
改进的安全策略模型 改进的安全策略模型
Windows Installer 增强功能 Windows Installer 增强功能
演练 演练
小结 小结

应用程序:使用 ClickOnce 进行用户启动的更新

此应用程序演示如何使用 ClickOnce 应用程序编程接口 (API) 向 Windows 窗体应用程序添加用户启动的更新功能。

返回页首返回页首

新概念

Visual Studio 2005 中,有三个可选的主要部署选项:Web、ClickOnce 和 Windows Installer 包。使用 MS-DOS XCopy 命令将应用程序文件从一个地方移动到另一个地方是另一种选项,它仍然是最简单、最直接的部署方法。它也最不灵活,实际上只适用于几种情况 — 例如,当更新 Web 应用程序(即使它应该只适合于不需要更新 IIS 元数据库的部署)或用于安装私有 .NET 程序集的情况。

ClickOnce是 Visual Studio 2005 中引入的一种集成部署技术,允许从 Web 服务器安装和运行 Windows 应用程序,而几乎没有与用户进行交互。作为 Microsoft Windows Server 2003、Windows XP、Windows 2000 和 Windows Me 附带的一部分,Windows Installer是一项安装和配置服务(作为单独的下载内容,它还可用于 Windows 9x 和 Windows NT 4.0)。您将发现,在 Visual Studio 2005 中构建于 Windows Installer 基础上的部署工具为提供了丰富的功能,可以快速部署和更新应用程序。

返回页首返回页首

背景

组成 ClickOnce 的服务集合体现了这些技术的发展,.NET Framework 的第一版中开始出现一种称为非接触部署(No-Touch) 的技术。在 .NET Framework 1.0 版发布时,它马上就解决了开发人员面临的许多问题。在 .NET Framework 上构建的托管应用程序得益于应用程序隔离和低影响部署(也称为 XCopy 部署)。通过提供一种共享组件和对组件进行版本控制的新方法,.NET Framework 1.0 还更正了“DLL Hell”问题(即安装将破坏现有的软件,并有可能破坏将来的软件安装)。消除了 DLL 的版本问题,也就为思考部署 Windows 桌面应用程序的新方法打开了一扇大门,与基于 Web 的应用程序相比,Windows 桌面应用程序可以提供更多的功能,并且可以提供更丰富的用户体验。

非接触部署作为一种基于 Web 的部署方法而出现,它允许安装 Internet Explorer 5.01 或更高版本的用户从某个 URL 下载和安装 Windows 桌面应用程序,并在其本地计算机上运行它们,而无需运行通常的 Setup.exe。该部署机制还称为“href-exes”,它将桌面应用程序的丰富功能与 Web 应用程序部署的简单性结合起来。

遗憾的是,直接从 Web 位置运行应用程序也存在局限性。首先,由 Web 页启动的应用程序仅在联机时可用,因此受网络连接的影响,这是由它们的本质决定的。href-exes 的另一个重要问题是其安全性问题。应用程序要运行,更有可能要求更改客户端上的默认安全策略。在 Visual Studio 的早期版本中,开发人员在设计时几乎不可能确定应用程序所需的权限。毫无疑问,许多非接触部署被不可预见的安全限制“巨石”所击碎,使得这些部署不能用于生产中。非接触部署的另一个局限性是,它没有提供管理版本发布的标准机制。

ClickOnce 可以保护用户的计算机和应用程序。当 ClickOnce 下载和安装程序时,它不会更改自身文件以外的任何文件。可以设置更新策略,并利用 .NET Framework 版本控制机制来管理更新。在本节中,您将看到一个应用程序,它阐释如何使用 ClickOnce 部署 API 允许用户自动更新 Windows 桌面应用程序。但在研究该实现的细节之前,我们来回顾一下 ClickOnce 的新功能,以及在必须从中选择的部署功能的范围内,它如何适合于 Visual Studio 2005。您还将详细了解到,以声明方式实现 ClickOnce 部署和自动更新是多么简单。

当我们讨论 ClickOnce 的安全性时,您将会更详细地了解到,Visual Studio 2005 IDE 中提供的工具使得无需推测计算和配置分布式 Web 胖客户端应用程序的安全需求。这是朝实现非接触部署的早期承诺迈进的一大步。

返回页首返回页首

代码访问安全性

代码访问安全性 (CAS) 是公共语言运行库 (CLR) 的一种功能,它基于代码的标识执行安全性。作为一名开发人员,您可能并没有将使用 CAS 作为日常事务的一部分,因为保证代码安全的基础结构内置于 .NET Framework 库中。然而,为了做出关于应用程序安全需求的正确决策,了解 CAS 非常必要 — 特别是 .NET Framework 如何处理证据、权限和代码组。同样非常重要的是,在开发项目的生命周期中,通常是在早期解决安全问题。详尽地讨论 CAS 超出了本书的范围。要了解更多信息,请访问 MSDN Web 站点(请参见 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcodeaccesssecurity.asp),该站点包含许多有关常见安全问题的文章,特别是有关 CAS 的文章;也可以阅读专门论述 .NET Framework 安全性的书籍,例如 Writing Secure Code, 2nd Edition, by Michael Howard and David LeBlanc (Microsoft Press, 2003) 或 .NET Framework Security, by Brian A. LaMacchia, et al. (Addison-Wesley, 2002)。

返回页首返回页首

ClickOnce 的优点

ClickOnce 构建于此前的早期计划的基础上,旨在于解决许多与其他部署方法相关的障碍。

自动/自助服务更新 非接触部署引入桌面应用程序基于 Web 的安装。ClickOnce 扩展了这种功能,提供一种自动更新应用程序或允许用户根据自己的判断来更新应用程序的机制。无需用户重新安装整个应用程序也可以应用更新。

独立应用程序为了避免有时发生与使用共享组件的应用程序相关的版本冲突,ClickOnce 将应用程序部署为一个独立的实体,该实体不会影响其他应用程序。即,通过 ClickOnce 安装的应用程序不会被以后的应用程序安装破坏。

非管理员安装只有具有管理员权限时才能运行 Windows Installer 应用程序。具有较低权限的帐户可以安装 ClickOnce 应用程序,而且只授予它们运行该应用程序所需的权限。

脱机访问通过 ClickOnce 部署的应用程序可以安装为联机运行或本地运行。在后一种情况中,它们与 Windows Shell 集成在一起,包括为应用程序添加一个“Start”菜单快捷方式。这样就可以随时随地访问 Web 部署的应用程序。

对于 .NET Framework 的 1.0 和 1.1 版本,Microsoft 为.NET提供了更新应用程序块,作为进一步扩展非接触部署优点的一种方法。该应用程序块由 Microsoft 模式与实践小组开发和发布,可以从 MSDN 免费下载,它包含文档和自定义 .NET 程序集(带有源代码),供开发人员为应用程序添加自助更新功能。(请参见 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/updater.asp。)

在资金、时间和精力方面,ClickOnce 部署也提供了非常高的成本效益。设想一下,这些节约下来的投入肯定能对应用程序设计中的关键决策点产生影响:由于需要一种方式来轻松地将应用程序提供给广大用户,并需要能够快速而简单地更新该应用程序,您已经多少次将解决方案构建为基于 Web 的应用程序?如果您是一名在托管网络环境中工作的开发人员,那么您将面临网络管理员带来的其他障碍 — 他们不愿意或不会支持部署更新,而该部署更新又要求在网络上的每个客户端系统中运行安装程序。

说到底,将解决方案构建为基于 Web 的应用程序是最顺畅的方式,这有几个很充分的理由。虽然牺牲了高级功能和丰富的用户界面,但部署和更新 Web 应用程序将更容易、更经济且更为轻松。ClickOnce 使得不需要在功能和容易部署之间进行折衷,因为它为胖客户端应用程序提供了简单和可靠的 Web 应用程序部署方式。

所有这些都表明,基于 Web 的应用程序将不会过时。它们仍可以为需要在各种操作系统上运行的解决方案提供无所不及的功能。对于完全功能的客户端安装,Windows Installer 包依然是最佳选择。但是,在许多情况下,开发人员现在有望将胖客户端应用程序提供给用户,而无需面对部署约束,而在过去,这些约束使得这种部署方式成为一种不切实际的选择。

作为其核心,ClickOnce 是内置于 .NET CLR 中的一组新部署功能。这些功能包括一个可编程的界面,以及集成在 Visual Studio 2005 IDE 中的设计时支持。此外,还可以将 ClickOnce 部署功能直接内置于应用程序本身中,而不需要构建一个单独的安装程序。

返回页首返回页首

发布 ClickOnce 应用程序

ClickOnce 技术集成在 Visual Studio 2005 IDE 中的两个主要部分。第一部分是“Build”菜单,它包含一个“Publish”菜单项。同样的命令在解决方案资源管理器中的解决方案和项目上下文菜单中也可用。Visual Studio 2005 IDE 中的第三个发布选项使用命令按钮,该命令按钮在项目设计器的“Publish”窗格中可用。(这表示 Visual Studio 2005 IDE 与 ClickOnce 集成的第二个主要部分。)选择“Publish”菜单命令(或单击“Publish”窗格中的“Publish Wizard”按钮)将启动“Publish Wizard”(如图 8-1 所示),这种工具可指导您完成发布所需的步骤。


8-1 发布向导。

发布向导的第一页要求选择应用程序的位置。该向导的其他步骤同样允许更改其他部署设置(例如,安装模式和用户安装应用程序的方式,以及选择签名应用程序和部署清单所需的公钥/私钥)。如果需要更改,请单击“Next”按钮,使向导前进一步。完成更新设置后,单击“Finish”。

部署清单是一个描述 ClickOnce 应用程序部署的 XML 文件,包括部署的当前版本、更新配置设置,以及最重要的 ClickOnce 应用程序的应用程序清单的当前版本。

应用程序清单是一个标识利用 ClickOnce 部署的应用程序的 XML 文件,包括标识应用程序的主要程序集、它的安全需求、应用程序使用的非程序集文件列表,以及应用程序运行所需的任何依赖项。

当首次发布应用程序时,Visual Studio 2005 在名为 publish 的解决方案中创建一个新文件夹,并将安装应用程序所需的文件存储在该目录中,包括部署清单和包含应用程序先决条件的引导程序。它还生成一个带有指向程序安装和先决条件的链接的 Web 页。如果将某个 Web 站点指定为发布的位置,ClickOnce 发布引擎就在目标 Web 服务器上创建一个虚拟目录,并将文件从本地发布文件夹复制到该位置。最后,ClickOnce 在 Web 浏览器中打开一个发布页,如图 8-2 所示。


8-2 发布页。

返回页首返回页首

安装和运行 ClickOnce 应用程序

如果部署应用程序是为了脱机使用(这是默认的安装模式),单击应用程序链接就可以开始在用户的计算机上安装应用程序。如果将应用程序配置为只可联机使用,那么将直接从发布页启动它。图 8-3 显示当尝试安装应用程序时接收到的安全确认消息。


8-3 安装确认对话框。

用户单击“Install”按钮后,应用程序就安装在用户计算机上的一个本地文件夹中。安装成功后,ClickOnce 子系统会自动从本地安装目录运行此应用程序。

返回页首返回页首

更新 ClickOnce 应用程序

将更新传递给应用程序的过程与发布应用程序原始版本的过程相同。发布更新之前唯一要做的事情就是增加应用程序的版本号。可以自动或手动增加发布版本号。默认情况下,将发布版本设置为每次发布应用程序就自动增加修订号。但是,如图 8-4 所示,可以清除“Automatically Increment Revision With Each Release”复选框来手动设置该值。


8-4 发布版本。

发布版本和应用程序程序集的版本号完全无关,注意到这一点非常重要。如果将应用程序配置为每次发布自动增加版本号,那么对于发布 ClickOnce 应用程序的新版本而言,最容易的方法是单击项目设计器中“Publish”窗格中的“Publish Now”按钮。发布子系统编译更新的应用程序,并将程序集和与其相关的应用程序清单存储在发布位置的一个新文件夹中。它还更新部署清单以指向新的应用程序清单。下次用户打开应用程序时(并假定将应用程序配置为检查更新),用户计算机上的 ClickOnce 运行时会发现新版本,然后通知用户更新可用或自动安装更新。

图 8-5 显示了一个典型的更新通知对话框。在该示例中,可以选择安装应用程序的更新版本或跳过更新。在 ClickOnce 应用程序的更新配置设置中,可以控制用户是否可以选择拒绝更新。


8-5 更新通知。

为了更好地理解 ClickOnce 应用程序如何获知应用程序的更新可用时间,可以研究图 8-6 所示的文件和文件夹。该图阐释一种典型的更新情况,即存储在 WeatherReport_1.0.0.0 文件夹中的应用程序的原始版本已经由存储在 WeatherReport_1.0.0.1 文件夹中的更新的版本进行更新。


8-6 已发布的应用程序文件。

部署清单(图 8-6 中所示的WeatherReport.application 文件)包含一个应用程序最新版本的条目。当应用程序检查更新时,ClickOnce 查看部署清单,并将其与应用程序的当前版本进行比较。如果可用版本比应用程序的当前版本更新,则 ClickOnce 或者显示一条提示消息来通知用户更新可用,或者自动更新应用程序,这取决于您如何配置更新应用程序设置。

图 8-7 阐释这个过程。服务器包含应用程序原始版本和更新版本 (1.0.0.1) 的应用程序文件。部署清单显示,应用程序有一个更新的版本可用。当已安装的应用程序执行更新检查时,它将阅读部署清单,并了解是否有一个更新可用。


返回页首返回页首

配置 ClickOnce 属性

虽然默认的 ClickOnce 设置在有些情况下是适合的,但您需要熟悉项目设计器的“Publish”窗格,以控制不同的部署方案。“Publish”窗格中的设置允许您配置高级部署选项,配置各种更新方案,为 ClickOnce 应用程序添加先决条件,并管理在应用程序清单中如何处理应用程序自身中包含的文件。

有关 Visual Studio 2005 项目设计器的详细信息,请参阅第 3 章“Visual Studio 2005 集成开发环境”。


8-8 项目设计器的“Publish”窗格。

Deployment Manifest
Version = 1.0.0.1
Application
Version = 1.0.0.0
Application
.0.0.0
Application
.0.0.1

发布位置

发布位置可以是一个 Web 站点、FTP 站点、文件共享或指向磁盘的路径。如果旨在将应用程序分布在可移动的介质(例如 CD),则选择磁盘路径是一种合适的选择。在目标 Web 服务器没有配置为使用 Microsoft Front Page 服务器扩展(发布到 Web 站点要求这样做)的情况下,使用网络文件共享或 ftp 服务器作为发布位置是一个不错的选择。

如果安装 URL 不同于发布位置,则在“Publish”窗格的“Installation URL”文本框中指定该地址。例如,如果发布到一个内部 Web 站点,而且该应用程序是供 Internet 用户使用的,那么这将是指定外部地址的地方。需要指定单独安装 URL 的另一种情况是:发布位置是一个文件共享或 ftp 服务器。

通过在“Publish”窗格包含的“Documentation And Support URL”文本框中设置 URL,还可以包含对以下二者的引用:应用程序的基于 Web 的帮助或其他支持文档。如果为该属性输入地址,那么它将作为发布应用程序时生成的发布页上的一个链接出现。

安装模式

安装模式将部署定义为已安装应用程序或已启动应用程序。表 8-1 总结每种选项的主要特点。

表 8-1 安装模式选项
已安装 已启动

从 Web、CD/DVD 或网络共享进行安装

直接从 Web 或网络共享运行

Shell 集成(“Start”菜单出现时,添加到“Add or Remove Programs”的条目)

没有 shell 集成

脱机可用 仅联机可用

各种应用程序更新策略始终运行最新版本的应用程序。

ClickOnce 安装的应用程序与按照传统方式安装的 Windows 应用程序具有相同的基本属性。ClickOnce 将程序快捷方式添加到“Start”菜单,而应用程序出现在本地的“Add or Remove Programs”小程序中,因此,它可以像其他程序一样卸载,也可以回滚到以前的版本。

可以在发布向导或项目设计器的“Publish”窗格中设置安装模式。在“Publish”窗格中,标题为“Install Mode And Settings”的部分包括两个选项。选择其中一个选项:

应用程序只能联机使用

应用程序也可以脱机使用

对版本回滚的支持仅限于 ClickOnce 应用程序以前的一个版本。

ClickOnce 启动的应用程序从其发布的 Web 页执行。这使其“感觉”更像 href-exe — 在“Start”菜单上没有添加 href-exe 的快捷方式,应用程序也未出现在“Add or Remove Programs”中。然而,虽然对于用户而言,以这种方式部署的应用程序好像是从源 Web 位置运行的,但它们实际上以与 Web 页缓存相似的方式在本机上缓存,两者的目标同样都是降低网络流量以提高应用程序的性能。这种类型的应用程序缓存起初是随非接触部署引入的,其中的可执行应用程序下载到本地计算机的程序集下载缓存中。

发布选项

Publish”窗格的“Install Mode And Settings”部分包括 4 个按钮控件,用于访问操作其他发布属性的对话框。如果单击最底端的按钮“Options”,将打开“Publish Options”对话框,如图 8-9 所示。


8-9 Publish Options”对话框。

发布语言Publish Language 属性控制 ClickOnce 应用程序安装过程中显示的用户界面项的语言。如果该属性设置为 Default,则安装使用用户计算机上的区域与语言设置。如果正在发布本地化版本的 ClickOnce 应用程序,那么将该属性更改为与应用程序本地化设置相匹配的语言和区域。

开始菜单名称如上所述,本地安装的应用程序具有 Windows 外壳程序集成,它会出现在“Start”菜单上。可以在“Start Menu Shortcut Resource Name”文本框中为应用程序指定出现在“Start”菜单项中的名称。如果该属性保留为空白,ClickOnce 将使用基础应用程序程序集的标题。

发布页当发布第一版的 ClickOnce 应用程序时,发布引擎创建一个名为 publish.htm. 的 HTML 页。该页显示了 ClickOnce 应用程序的名称、安装应用程序的链接、所有先决条件(如果指定)或支持的文档,以及指向 MSDN ClickOnce 帮助主题的链接。作为发布过程的一部分,该页与 ClickOnce 应用程序文件一起复制到发布位置。

如果发布后续版本的应用程序,将不改写发布页面。这意味着在发布该页面后,可以利用任何 HTML 编辑器自定义页面,而无需担心以后丢失这些更改。

“Publish Options”对话框允许更改发布页的默认名称 publish.htm。发布后通过清除“Automatically Open This Page On Publishing”复选框,还可以禁止在 Web 浏览器中打开该页面。

部署策略票证如果计划在托管网络中部署应用程序(例如,如果您是一位在 Intranet 上部署应用程序的公司开发人员),那么可以使用 ClickOnce 进行所谓的可信应用程序部署,它描述一种用于安全而可靠地部署应用程序的模型,要求高级别的信任而不必提示用户。通过将 ClickOnce 部署策略发布到将特定应用程序发布者定义为可信任的客户端,组织内的系统管理可以启用这种类型的部署。(这些发布者也称为信任颁发者。)一旦安装了这一策略,由这些发行商之一签署的任何 ClickOnce 应用程序都可以接收更高级别的信任。

可信应用程序部署对于非托管网络的部署不可行。相反,必须使用“权限提升”,本章的“ClickOnce 安全性”一节将对此进行详细讨论。

作为应用程序开发人员,需要执行下列两个基本步骤来利用该安全模型:

1.

从组织的信任许可证颁发商处获得信任许可证文件 (.tlic),并将其添加到您的项目中。

2.

将 ClickOnce 应用程序的 Deployment Policy Ticket 属性设置为信任许可证文件。

将信任许可证文件添加到项目后,可以使用“Publish Options”对话框选择 Deployment Policy Ticket 属性。许可证文件将出现在对话框提供的下拉列表中。

有关安全策略管理和创建信任许可证的详细讨论超出了本书的范围。有关这些主题的详细信息,请参见 MSDN 技术资源库中有关 Visual Studio 2005 的内容。

确定应用程序更新需求

在部署第 1 版应用程序之前,应仔细考虑更新需求,因为在发布版本 2 时,您所做的选择将会起作用。例如,如果将第 1 版的 ClickOnce 应用程序配置为应用程序运行时在后台检查更新,那么,当准备版本 2 的应用程序时,决定要在应用程序启动之前检查更新,则这种更改将直到版本 2 成功安装后才可应用。

或者提出 “我需要用户始终拥有最新版本的应用程序吗?” 这样的问题,考虑如何处理通用的更新方案。根据特定应用程序针对此问题的回答,可以选择一种能够灵活提供更新的更新策略,或使用一种更加严格的方法,以确保用户始终拥有最新版本的应用程序。

默认情况下,当应用程序运行时,ClickOnce 应用程序在后台查找更新。如果更新实际可用,那么下次用户运行该应用程序时,将出现一个提示询问她是否安装此更新。这是一个相当灵活的更新方法的示例,因为在发现更新后,用户继续使用该应用程序。可以将这种行为更改为在应用程序启动之前检查更新。在这种情况下,当更新可用时,在应用程序运行前 将出现更新提示。这种方法仍然允许用户控制是否安装更新,但至少在应用程序运行之前使其有机会进行决策。

配置自动更新选项

尽管在某些情况下,提示用户这一功能运行良好,但在强制更新的情况下,会出现其他问题。一个显而易见的的例子就是,如果应用程序将数据发送给服务器,之后在服务器端更改了数据模型;而过时的客户端就有向服务器发送错误数据的风险。可以通过将应用程序配置为自动更新来解决这个问题,如以下步骤所述:

1.

单击项目设计器“Publish”窗格的“Updates”按钮。这将打开“Application Updates”对话框,如图 8-10 所示。

2.

选中“Application Should Check For Updates”复选框。

3.

要选择应用程序应该何时检查更新,可以选择“Before The Application Starts”。

4.

清除“Allow The Users To Choose Whether To Accept The Update”复选框。


8-10 Applications Updates”对话框。

请记住,配置应用程序更新仅对于本地安装的 ClickOnce 应用程序是必需的。如果将应用程序配置为联机启动,则更新就定义为自动提供(即,其工作方式与 Web 页更新的方式完全相同)。

设置更新检查间隔

除非为其他配置,否则支持 ClickOnce 的应用程序在每次运行时都要检查更新。可以将这种行为更改为指定的时间间隔 — 例如,每两周一次。如果应用程序不要求用户立即接收最新的应用程序更新,那么这就是一个明智的选择。如果还需要实现用户启动的更新以允许用户检查应用程序本身是否有更新,那么将自动更新检查设置为较长的时间间隔是一种不错的选择。(稍后在本章的“演练”一节中,将看到如何实现用户启动的更新检查。)

考虑带宽

ClickOnce 应用程序使用的网络连接的质量是确定检查更新策略时应当考虑的一个因素。如果网络的带宽较高,那么在应用程序启动之前检查更新比较适合。另一方面,如果网络很慢,这会导致应用程序加载非常慢。在这种情况下(如果用户能够接受临时使用应用程序的过时版本),一种较好的选择是在应用程序运行时检查更新,以允许 .NET Framework 在后台线程中执行更新检查。

应用程序先决条件

在 ClickOnce 应用程序运行之前,要求在计算机上安装 .NET Framework 的正确版本。另外,和标准的安装程序一样,ClickOnce 应用程序可能需要其他的软件组件。例如,如果应用程序使用最新版本的 Microsoft 数据访问组件 (MDAC) 或 Microsoft DirectX,那么可以将它们作为单独的安装程序包含在 ClickOnce 部署中,并与 ClickOnce 应用程序一起发布。提供应用程序先决条件的单独安装程序通常称为引导。引导程序具有以下主要功能:

它是只安装目标机上所需组件的轻量级安装程序。

它支持标准安装 EXE 和 Windows Installer 安装包(.msi 文件)。

它支持自动重新启动和恢复。

可以很容易地将可重新发布的包添加到可用先决条件列表中。

引导程序将 ClickOnce 和更紧凑的软件安装联系起来。引导程序在企业设置中也是有用的,其中各种不同的应用程序共享内部构建的 .NET 组件,并需要将这些组件安装在全局程序集缓存 (GAC) 中。因为 ClickOnce 应用程序文件只能安装到本地应用程序缓存,所以发往 GAC 的程序集必须利用添加到应用程序先决条件的 Windows Installer 安装包(.msi 文件)来安装。需要牢记的是:引导程序要求 Full Trust 权限。您的用户将需要管理权限来安装包含在引导程序中的组件,而与 ClickOnce 应用程序本身指定的安全级别无关。

要配置哪些安装组件包括在引导程序中,可以使用“Prerequisites”对话框,它提供一组可用的可重新发布包。(请参见图 8-11。)默认情况下,Microsoft .NET Framework 2.0 可重新发行包 (Dotnetfx.exe) 是预先选择的。这是一个引导程序实用工具,如果它没有出现在用户的计算机上,则可自动下载并安装 .NET Framework。对话框允许您选择从与应用程序(默认的)相同的位置处下载先决条件,或者指定另一个下载位置。如果组织使用一组共同的先决条件,并且希望在部署服务器上保留磁盘空间,此外还要确保每个应用程序接收相同版本的先决条件,那么使用不同的位置是一个不错的选择。

先决条件是可扩展的 — 可以将您自己的 Windows Installer .msi 文件或其他第三方可重新发布包添加到引导程序中。有关详细信息,请参阅 MSDN 技术资源库中有关 Visual Studio 2005 的文章“How to:Add Your Own Prerequisites to a ClickOnce Application”。


8-11 “Prerequisites”对话框。

当发布应用程序时,先决条件被捆绑到引导程序的安装程序中。最终的发布 Web 页包含用于安装 ClickOnce 应用程序和引导程序的单独链接。

警告先决条件不能使用 ClickOnce 的自动更新功能进行更新。只有应用程序本身才可进行更新。

应用程序文件

发布一个 ClickOnce 应用程序时,项目中的所有文件与应用程序一起发布。在有些情况下,项目可能包含开发所需的文件,但您不想将它们包含在部署中。在其他情况下,您可能想指定某些文件只能根据可控条件进行安装,从而使应用程序的性能和安装时间达到最佳的程度。使用“Publish”窗格中的“Application Files”对话框,可以排除文件,将文件标记为数据文件或先决条件,并创建当应用程序需要时才下载的文件组。

图 8-12 说明如何使用“Application Files”对话框来对必需的和可选的文件进行分组。位于列表顶部的文件 (OnDemand.exe) 确定为应用程序的入口点,而且是部署所需的组件。应用程序图标文件 (App.ico) 也归类为必需项。但将程序集 OrderListControl.dll 和 OrderLibary.dll 分配到名为“OnDemand”的组。这些文件在应用程序清单中将标记为可选,并且在首次使用应用程序时不进行安装。

为了安装标记为可选的项,必须在 ClickOnce 应用程序中包含能够识别应用程序何时需要可选程序集或其他文件的代码。然后,代码必须调用 System.Deployment.ApplicationDeployment类的 DownloadFiles方法或 DownloadFilesAsync方法来安装所需的文件。有关更多信息,请参阅 Visual Studio 2005 文档中的“Walkthrough:Downloading Assemblies On Demand with the ClickOnce Deployment API”主题。


8-12 “Application Files”对话框。

首次打开“Application File”对话框时,类型列将所有的文件显示为应用程序文件(.dll 文件除外),这些文件都作为应用程序程序集列出。如图 8-12 所示,可以更改某些文件的类型。对话框下拉列表中可用的类型选项会根据相关文件类型的变化而变化。例如,可以将 .dll 文件指定为 Application Assembly 或 Prerequisite。(不能显式地排除它们。)另一方面,可将文本文件标记为 Application File、Data File 或 Excluded。

“Application File”对话框的第三列列出应用程序的文件组。最初,列出的唯一组是 [Required]。如果需要标识那些应当包含在部署但只在某些条件下下载(即可选安装)的文件,那么应当创建额外的文件组并为它们分配文件。

要添加新组,请遵循以下步骤:

1.

在“Application File”对话框中,选择希望包含在新组中的文件。

2.

单击“Group”字段下的下拉列表并选择“New”。这会显示一个“New Group”对话框。

这样,为您产生一个新组名,可将“Application File”对话框列表中的其他文件分配到新组。

返回页首返回页首

ClickOnce 安全性

在还没有过多考虑将 ClickOnce 用作部署胖客户端应用程序的新方法之前,您可能已经开始关心对于安全性而言,其意味所在。ClickOnce 提供一个用于完全功能桌面应用程序的简化部署模型。这些应用程序可以来自各种不同的源,而且您可能对这些源都有不同程度的信任。(例如,与来自 Internet 的应用程序相比,您可能更信任来自 Intranet 的应用程序。)实际上,ClickOnce 的设计很适合部署非常可靠和安全的应用程序。

返回页首返回页首

运行在沙箱中的 ClickOnce 应用程序

默认情况下,ClickOnce 应用程序在一个安全的沙箱中执行。根据特定用户计算机上安装的 .NET 安全策略和 ClickOnce 应用程序的安装或运行位置来确定沙箱。表 8-2 列出基于发布位置的 ClickOnce 应用程序的默认权限。

表 8-2 发布位置的安全区域
发布位置 安全区域

从 Internet Web 站点启动

Internet 区域

从 Internet Web 站点安装

Internet 区域

从 Intranet Web 站点安装

Intranet 区域

从网络文件共享进行安装

Intranet 区域

从 CD-ROM 进行安装

全部

.NET Framework 中的默认安全策略具有很高的限制性。在默认的 Internet 区域下运行的应用程序只引用了一些限制,例如,不能访问本机文件资源,不能连接到数据库,并且不能与外部 Web 资源进行通信。事实上,在部署 ClickOnce 应用程序之前,需要确定应用程序为完成工作需要什么样的代码访问安全性 (CAS) 权限。然后,在安装时需要配置应用程序以请求这些权限。

返回页首返回页首

配置 ClickOnce 代码访问安全性

Visual Studio 2005 IDE 项目设计器的“Security”窗格提供一个配置 ClickOnce 应用程序权限的界面。如果它在 Internet 上部署,它就具有默认的 Internet 安全权限。如果在 Intranet 中部署,它就具有 Local Intranet 权限。如果通过其他方式部署,它就具有 Full Trust 权限。正如前一节描述的,可以使用默认的权限部署 ClickOnce 应用程序,在这种情况下,不需要在“Security”窗格中进行任何更改。在 Internet 或 Intranet 部署方案中,默认的权限可能太受限制。相反,使用 Full Trust 权限部署的应用程序可以进行无限制的系统访问。但是,不论哪种情况,最佳做法是,应用程序应当只包含它实际运行所需的权限。为了帮助您实现这个目标,“Security”窗格提供一个自定义 ClickOnce 安全设置的界面,如图 8-13 所示。


8-13 项目设计器的“Security”窗格。

在开始为 ClickOnce 自定义安全设置之前,需要选中“Enable ClickOnce Security Settings”复选框。这会激活“Security”窗格中一组与安全相关的控件。通过选择四个应用程序安装区域之一,开始自定义过程:Local Computer (Full Trust)、Local Intranet、Internet 和 Custom。因为自定义安全设置的目标是定义运行应用程序所需的最低权限,所以可以选择与应用程序所需权限最匹配的区域,并将该区域作为权限集的起点。然后,在“Security”窗格中提供的权限表中,通过启用或禁用所需的单个权限来进一步更改权限集。

要更改表中某个特定的权限,可以滚动到其中列出该权限的行。Setting 列包含一个下拉列表,并有三个选项:Include、Exclude 和 Zone Default。选择 Include 可以添加权限,选择 Exclude 可以移除权限。选择 Zone Default 可以将权限重新设置为所选区域的默认状态。 8-14 阐释手动配置权限的示例。虽然包含 FileIOPermission,但FileDialogPermission 的设置已经显式地从权限集中排除。请注意,信息图标出现在 Included 列,该图标指示 FileIOPermission 所需的信任级别比所选安全区域(在本例中为 Local Intranet)提供的信任级别高。


8-14权限设置对话框。

如果在所选择的区域中加入一个默认情况下不包含的权限,那么在权限行中就会出现一个信息图标。这指示应用程序需要提高权限,以在所选择的区域中运行。

可以通过更改单个权限的特定属性来进一步更改它们。这允许为特定的文件或目录、注册表项或单个 Web 站点定义权限,这里列举几个示例。

为了举例说明,图 8-15 显示 FileIOPermission 的属性页。该窗口显示的可用属性将根据基本权限的不同而有所不同。例如,对于 FileIOPermission 的情况,可以利用网格中提供的复选框来指定哪些文件或文件夹需要文件访问,并进一步定义读、写、追加或路径发现所需的访问类型。要请求对文件系统的不受限访问,请选择“Grant assemblies unrestricted access to the file system”单选按钮。


8-15为 FileIOPermission 定义属性。

如果准确知道应用程序所需的权限,那么手动修改安全权限就可以了。评估应用程序的安全需求绝对应该是项目开发生命周期的一个必不可少的组成部分,因此应当了解需要配置什么样的权限。但是,由于许多原因,这并不总是最好的方法。您可能不能确定应用程序所需的权限,或某种特定的权限如何影响应用程序的行为。在不确定的情况下,您请求的权限很可能高于所需的权限,这违背了确保应用程序只拥有运行所需权限的基本目标。幸运的是,Visual Studio 2005 IDE 包含两个附加工具 — 权限计算器以及允许使用已配置的安全设置调试应用程序的工具,这可帮助您准确地确定 ClickOnce 应用程序的安全需求。

返回页首返回页首

权限计算器

权限计算器可以从项目设计器的“Security”窗格中获得。如果没有确定应用程序的代码访问安全需求,则可以使用“权限计算器”工具来静态分析项目中的代码。分析完成后,该工具自动将项目的 ClickOnce 安全权限更新为一组自定义权限。

警告因为权限计算器对代码进行静态分析,所以在有些情况下,该工具可能不是百分之百的准确。例如,如果应用程序需要动态文件系统访问,那么就需要手动配置这种权限。

返回页首返回页首

在安全区域中进行调试

作为权限计算器的配套工具,可以利用当前定义的 ClickOnce 安全设置在调试器中运行应用程序。这种方法允许您使用部署应用程序时授予的确切权限来测试应用程序。回顾本章前面对非接触部署局限性的讨论,其中开发人员在一个具有完全信任的环境中构建和调试应用程序,然后在 Internet 或 Intranet 上部署这些应用程序时,让它们引发安全异常。使用当前定义的 ClickOnce 安全设置在调试器中运行应用程序,这使您在实际部署应用程序时,完全不必猜测它是否具有足够的权限。

要配置项目以在沙箱中进行调试,请单击“Security”窗格上的“Advanced”按钮,显示配置应用程序的对话框,从而在当前选择的 ClickOnce 安全设置下运行。还可以指定下载 ClickOnce 应用程序的 URL。

图 8-16 显示了带有典型配置的“Advanced Security Settings”对话框。“Debug This Application With The Selected Permission Set”复选框被选中。在文本框中输入的 URL 值将确定在调试器中执行应用程序时为其授予的信任级别。


8-16 在沙箱中启用调试。

一旦将应用程序配置为在沙箱中调试,就只需在调试器中运行应用程序,并运用其功能。如果您尝试执行的应用程序在所选安全区域中没有所需的权限,那么就会像实际部署应用程序那样显示一个运行时安全错误。

返回页首返回页首

提升权限

现在考虑为 ClickOnce 应用程序建立安全设置后执行的操作。当发布 ClickOnce 应用程序时,将在项目设计器的“Security”窗格中定义的权限写入应用程序清单的 trustInfo 元素中。

当用户启动或安装应用程序时,ClickOnce 子系统从应用程序清单中读取请求的权限,并通知用户他们是否超越了默认安全区域提供的权限。例如,如果在 Internet 上部署了一个需要本地文件系统访问的 ClickOnce 应用程序,并且通过将应用程序配置为要求最低权限集而遵循了良好的安全实践,那么当用户从其发布位置安装应用程序时,系统将出现一个提示,声明应用程序要求比 Internet 区域更高的信任级别。

图 8-17 显示了当用户尝试安装要求更高信任级别的 ClickOnce 应用程序时出现的安全警告消息。消息窗口底部的消息警告:应用程序要求对计算机进行可能不安全的访问。


8-17 应用程序安装安全警告。

返回页首返回页首

改进的安全策略模型

正如在“部署策略票证”一节中所描述的,对于在托管网络中使用 ClickOnce 部署的组织而言,Visual Studio 2005 引入了一种新的安全策略模型,网络管理员可以通过它为分布在整个企业中的应用程序建立部署机构。这要求在本地系统上只一次性安装策略票证,为由策略标识的实体授予分配 ClickOnce 应用程序的特殊权限。对于安装了这种策略的计算机,系统会自动授予其升高的权限,而不会对用户进行提示。

Authenticode 签名

最后,安全策略也可以根据 ClickOnce 应用程序的发布者授予权限。数字证书提供有关软件发布者的信息,这些信息经过可信的第三方进行验证。对于商业软件的发行,您可能会从诸如 Thawte 或 VeriSign 这样的公司获得一个证书。您可以使用数字证书来签署部署清单。.NET Framework SDK 包含一个称为 SignCode.exe 的文件签名工具。

返回页首返回页首

Windows Installer 增强功能

Microsoft Windows Installer 是一种安装和配置服务,它是作为 Windows Server 2003、Windows 2000 和 Windows XP 的一部分提供的。到撰写本文时为止,大多数系统都使用 Windows Installer 2.0 版(包括 Windows 9x 和 Windows NT 4.0,其中 Windows Installer 可以作为单独下载进行安装)。Visual Studio 2005 将支持 Windows Installer 3.0 版,在下面的几节中,我们将介绍该版本中提供的一些增强功能。

警告虽然可以在 Windows 9x 和 Windows NT 4.0 中使用 Windows Installer 2.0 版,但在这些旧的操作系统上不能使用 Windows Installer 3.0 版。

早期的安装程序类型使用一种过程式模型,提供应用程序安装的脚本指令。安装包文件(其扩展名为 .msi)使用结构化的存储来组织资源以及与特定安装相关联的自定义操作。在安装时,Windows Installer 引擎分析安装文件中的数据,以构建安装脚本和一个可用于以后卸载程序的回滚脚本。为了防止卸载破坏其他的应用程序,本地数据库跟踪有关计算机上所有应用程序的信息,例如注册表设置和已安装的文件。卸载时,Windows Installer 读取该数据库,以确认没有其他应用程序依赖于要移除的文件或注册表设置。

Windows Installer 还提供一种自修复工具,它允许应用程序自动重新安装丢失的文件,这些文件可能已经被用户删除。一个相关的功能是安装回滚,如果在安装的过程中出现了致命错误,Windows Installer 可以中止安装,并使计算机返回到其原始状态。

Windows Installer 3.0 增强功能

Windows Installer 3.0 版包含了现有 Windows Installer 功能集的许多增强功能,并添加了新的功能区。Windows Installer 3.0 的一个增强功能是更好的作者控制和资源管理,包括对查询计算机界面和安装在计算机上其他软件产品界面的改进。

Windows Installer 3.0 中最重要的改进是添加了软件修补的功能。尽管在过去的应用程序更新中可能要求完全重新安装特定的应用程序,但是修补安装包(或 .msp 文件)允许开发人员为其应用程序部署增量更新。MSP 文件的主要优点是,它们使得安全包更小、性能更好。

Visual Studio 集成

Visual Studio 2005 基于 Windows Installer 技术构建,包含用于创建综合、全面安装的工具。也就是说,您还将发现,Visual Studio 2005 没有包括充分利用 Windows Installer 功能所需的全部创作工具。例如,Visual Studio 2005 IDE 显然不能创建 Windows Installer 3.0 软件更新包。

对于综合的 Microsoft Windows Installer 创作工具,您应当研究来自第三方供应商的产品,例如 InstallShield 和 Wise。

安装项目Visual Studio 2005 包含几个基于 Windows Installer 技术构建安装程序的项目模板。如图 8-18 所示,安装程序项目有三种基本类型:安装项目、Web 安装项目和智能设备 CAB 项目。根据安装程序部署位置的不同,它们之间也有所不同:安装项目将文件安装到目标计算机的文件系统中;Web 安装项目将文件安装到 Web 服务器的一个虚拟目录中;而智能设备 CAB 项目安装基于 Pocket PC、Smartphone 或其他 Windows-CE 的应用程序。


8-18 Visual Studio 2005 安装项目模板。

8-3 总结了各种不同的部署项目类型及其目的。除了上面讨论的三种主要安装项目外,您还可以找到构建“合并模块”或 CAB 项目的项目模板。

表 8-3 Visual Studio 2005 部署项目类型
项目 类型目的

安装项目

为基于 Windows 的应用程序构建安装程序

Web 安装项目

为 Web 应用程序构建安装程序

合并模块项目

可由多个应用程序共享的包组件

CAB 项目

为下载到旧式 Web 浏览器创建一个 cabinet 文件

智能设备 CAB 项目

为智能设备应用程序构建安装程序

安装项目模板的另一种选择是 Setup Wizard;虽然它自身不是一个安装项目,但选择该项将启动一个向导,指导您完成选择正确部署项目类型的过程。

使用适合于 Visual Studio 6.0 的 Visual Studio 安装程序加载项创建的 Windows Installer 项目文件 (.wip) 不能在 Visual Studio 2005 中打开。

合并模块合并模块是一种特殊类型的部署项目。它们可用于以单个文件的形式提供应用程序的共享代码、文件、资源、注册表项和安装逻辑。作为一种简化形式的 .msi 文件,合并模块具有一个 .msm 文件扩展名。同样,它们不能直接安装,需要合并到一个安装项目中。当将合并模块合并到应用程序的 .msi 文件中时,安装组件(包含在合并模块中)所需的全部信息和资源都合并到应用程序的 .msi 文件中。因为安装组件所需的全部信息都作为单个文件提供,因此使用合并模块有助于减少版本冲突、丢失注册表项以及错误地安装文件。

提示可以从“Project”菜单将合并模块直接合并到“Setup Project”或“Web Setup Project”中。

构建 Windows Installer 安装包

如果在 Visual Studio 的早期版本中使用过安装项目,那么您应该对在 Visual Studio 2005 中构建安装项目所需要执行的任务非常熟悉。在大多数情况下,您希望将安装创建成包含要部署的应用程序解决方案的一个子项目。可以选择一个预定义的安装项目或者 Setup Wizard 来创建该项目的外壳。使用基于 Windows Installer 的安装程序(而不使用 ClickOnce)的一个主要优点是,在自定义安装时它提供了灵活性。而且,Visual Studio 2005 IDE 提供编辑器以处理注册表设置、文件类型以及关联项。还可以为安装自定义用户界面,指定启动条件,定义要在安装后执行的自定义操作。

提示请记住,对于 ClickOnce 部署,可以包含 Windows Installer 包作为先决条件。

安装文件、文件夹和快捷方式安装项目的基本任务是将文件安装到目标计算机。文件系统编辑器表示目标计算机上的文件系统,使用该工具可以指定应用程序文件安装的位置。在大多数情况下,希望将应用程序文件放在 Application Folder 中或在 Application Folder 下创建的子文件夹中。安装在目标计算机上以后,来自 Application Folder 的文件将位于 Program Files\Manufacturer\ProductName文件夹中,其中 Manufacturer 是安装 Visual Studio 时使用的公司名,而 ProductName 是用于部署项目的名称。可以在安装项目的属性窗口中重写这两个设置。

图 8-19 显示了某个安装项目的文件系统编辑器,它将包含标题为“WeatherReport”的项目的主要输出。请注意,该应用程序项目和安装项目 (WeatherReportMSI) 都列在解决方案资源管理器中。Application Folder 还包括一个正在安装的应用程序的快捷方式,以及与应用程序相关联的图标文件 (CLOUD.ICO)。将图标文件添加到 Application Folder 后,可以用它来设置快捷方式的图标属性,或与添加到目标计算机上 Add or Remove Programs 列表中的项关联的图标的属性(使用安装项目的 AddRemoveProgramsIcon属性进行设置)。


8-19 文件系统编辑器。

您还可以配置安装,将项添加到目标计算机的桌面和/或“Start”菜单。最常见的情况是添加一个已安装应用程序的快捷方式。在文件系统编辑器中,在名为“User’s Desktop”和“User’s Program Menu”的文件夹中添加快捷方式,从而分别在用户的桌面和“Start”菜单中安装快捷方式。在图 8-19 所示的例子中,可以只剪切“Application Folder”中列出的快捷方式,并将其粘贴到“User’s Desktop”或“User’s Program Menu”中,或者在两者中都粘贴。

创建文件关联使用 File Types Editor 来建立目标计算机上的文件关联,方法是将文件扩展名与应用程序相关联,并指定每种文件类型允许的操作。还可以指定文件类型的默认操作,例如打开或打印文件。当用户双击 Windows 资源管理器中的文件时,会出现默认操作。当用户右键单击 Windows 资源管理器中的文件时,指定的所有操作在上下文菜单中都显示为命令。图 8-20 显示了一个使用 File Types Editor 为文件类型 .wxl 添加“Open”与“Print”操作的示例。


8-20 File Types Editor。

修改用户界面系统自动提供一组在安装期间显示的默认对话框。根据正在构建的项目的类型,所提供的这组对话框有所不同。使用用户界面编辑器,可以将对话框重新排序或删除对话框。

如图 8-21 所示,在编辑器中显示的对话框树包含两部分:Install 与 Administrative Install。Install 部分包括终端用户运行安装程序时显示的对话框,而 Administrative Install 部分包含系统管理员将安装程序上传到某个网络位置时显示的对话框。如果想构建一个没有用户界面的安装,只需在对话框树上删除 Install 部分中的所有对话框。或者,可以从一组可用的模板将对话框添加到安装项目中。


8-21 用户界面编辑器。

管理注册表项和值如果应用程序安装需要更改注册表,可以在安装期间使用注册表编辑器来添加注册表项和值。如图 8-22 所示,注册表编辑器提供了一个用于添加注册表设置的拆分窗格窗口。左边窗格显示安装目标计算机上注册表的分层视图,可用它来构建指向一个或更多注册表项的路径。使用右边的窗格来为当前选择的注册表项添加值。


8-22 注册表编辑器。

定义启动条件使用启动条件编辑器来定义成功运行安装所必须满足的条件。例如,可以检查特定版本的操作系统。如果用户尝试在一个不满足条件的系统上安装,安装将中止。还可以配置启动条件来搜索目标计算机上的某个特定文件、注册表项或组件。在开始安装时,Windows Installer 执行搜索和条件评估,并按启动条件编辑器中所示的顺序执行。

图 8-23 显示了启动条件编辑器。该编辑器包含添加搜索和启动条件的文件夹,它显示了要求有特定版本的 .NET Framework 的默认启动条件。对于这种特定的启动条件,“Properties”窗格允许您指定支持的运行库。


8-23 启动条件编辑器。

定义自定义操作自定义操作提供了一种在安装结束时执行任务的机制。例如,您可能希望安装应用程序后启动一个自注册的程序或延迟 Web 服务的帐户信息,或者希望指导用户进行关于卸载的客户满意度调查。自定义操作构建为单独的 .dll 或 .exe 文件,然后使用自定义操作编辑器添加到项目中,其中这些操作与不同的安装阶段有关。图 8-24 显示了自定义操作编辑器,它包括几个单独的文件夹,用于放置执行 Install、Commit、Rollback 或 Uninstall 任务的二进制文件。


8-24 自定义操作编辑器。

构建安装包构建安装包与编译一个已完成的 .NET 程序集没有什么不同。从“Project”菜单上选择“Build”,使 .msi 文件与引导程序一起编译。您还可以从 Visual Studio 2005 IDE 直接测试安装。当某个安装项目在 IDE 中运行时,“Project”菜单包含 Install 和 Uninstall 的菜单项,使得安全地测试正在开发的安装成为一件非常简单的事情。图 8-25 显示项目的 bin 目录中出现的安装包 (MSIDeploy.msi) 和引导程序 (setup.exe)。


8-25 已编译的 .msi 安装文件和引导程序。

返回页首返回页首

演练

本示例是一个 Visual Basic .NET Windows 窗体应用程序,它使用 ClickOnce API 提供用户启动的更新。开始之前,请确保禁用项目属性中的自动更新检查;让应用程序在用户每次启动时都检查更新,这使用户启动的更新可以检查冗余(除非您希望用户永远不能关闭应用程序!)。

重要事项要通过代码使用 ClickOnce API,可以将项目引用包含在 System.Deployment 程序集中。

提供 UI 访问

当然需要为用户提供一种检查应用程序更新的方式。一种选择是在应用程序主窗体上放置“Check For Updates”菜单项。如图 8-26 所示,演示应用程序包含了使用同步或异步 ClickOnce API 版本进行更新检查的子菜单。


8-26 使用户能够从“Help”菜单轻松访问更新。

添加代码以检查更新

在主窗体代码文件的顶部,按如下方式导入部署命名空间:Import System.Deployment

接着,向检查更新的菜单项的单击事件处理程序添加代码。ApplicationDeployment 是一个包含在 System.Deployment命名空间中的类,您将使用该类的属性和方法以编程方式更新当前的部署(还要使用该类实现文件的按需下载)。在创建该类的实例之前,检查静态的 IsNetworkDeployed 属性,它是一个指示当前应用程序是否是一个 ClickOnce 应用程序的布尔值:

If True = ApplicationDeployment.IsNetworkDeployed Then
‘Update check code goes here.
End

根据代码段的说明,将更新检查代码放到 if 语句中是明智的,这段代码确认这是否一个 ClickOnce 应用程序。如果尝试为非 ClickOnce 部署的应用程序创建一个 ApplicationDeployment实例,会产生 InvalidDeploymentException错误。而且,不能直接创建一个 ApplicationDeployment实例,而要使用返回 ClickOnce 应用程序当前 ApplicationDeployment 对象的静态属性 CurrentDeployment:

Dim thisDeployment as ApplicationDeployment = _
ApplicationDeployment.CurrentDeployment

一旦创建了 ApplicationDeployment对象的一个实例,就可以调用 CheckForUpdate 方法来确定是否有一个更新版本的应用程序可用。如果有更新,该方法就返回一个布尔值 true:

If True = thisDeployment.CheckForUpdate() Then
‘New version of application is available.
Else
‘Application is up-to-date.
End If

该方法的异步版本为 CheckForUpdateAsync。要实现该方法,首先需要为 CheckForUpdateCompleted 事件添加一个事件处理程序:

AddHandler thisDeployment.CheckForUpdateCompleted, _
AddressOf CheckForUpdateCompleted
thisDeployment.CheckForUpdateAsync()

CheckForUpdateCompleted 事件的方法签名包含一个 CheckForUpdateCompletedEventArgs对象。在事件处理程序中,需要检查 CheckForUpdateCompletedEventArgs的 UpdateAvailable属性布尔值来确定该应用程序是否有新版本可用:

Private Sub CheckForUpdateCompleted(ByVal sender As Object, _
ByVal e As CheckForUpdateCompletedEventArgs)
If e.UpdateAvailable Then
‘New version of application is available.
Else
‘Application is up-to-date.
End If
End Sub

在主应用程序线程上调用 CheckForUpdateCompleted 事件。因此,在该回调中直接使用应用程序的 Windows 窗体控件非常安全。ApplicationDeployment类的 Update 方法将应用程序更新为最新版本:

thisDeployment.Update()

该方法的异步版本 UpdateAsync 使用的模式与 CheckForUpdateAsync 方法使用的模式相同。UpdateAsync方法引发两个单独的事件:在下载更新的应用程序文件期间,ProgressChanged不时出现,这对于报告大型应用程序的安装进度或在一个较慢的网络连接上更新该执行非常有用;更新完成后,UpdateComplete出现。在调用 UpdateAsync方法之前,首先为 UpdateComplete事件和 ProgressChanged事件(可选)添加事件处理程序:

AddHandler thisDeployment.UpdateCompleted, AddressOf Update_UpdateCompleted
AddHandler thisDeployment.ProgressChanged, AddressOf Update_ProgressChanged
thisDeployment.UpdateAsync()

ProgressChanged事件处理程序的方法签名包含一个 DeploymentProgressChangedEventArgs参数。可以通过访问该对象的属性来报告应用程序更新的状态。在本示例中,进程信息写入应用程序主 Windows 窗体状态条上的面板中。

Private Sub Update_ProgressChanged(ByVal sender As Object, _
ByVal e As DeploymentProgressChangedEventArgs)
‘Calculate progress of update and store value in local string.
Dim updateProgress As String = String.Format( _
“{:D}K out of {1:D}K downloaded - {2:D}% complete", _
e.BytesCompleted / 1024, _
e.BytesTotal / 1024, e.ProgressPercentage)
‘Update status bar with update progress.
Me.StatusStripPanel2.Text = updateProgress
End Sub

UpdateComplete事件处理程序的方法签名包含一个 AsyncCompletedEventArgs参数。事件处理程序中的代码应当检查该对象的属性来确定应用程序更新的结果。AsyncCompletedEventArgs公开两个属性,一个是 Cancelled 属性,表明是否取消更新,另一个是 Error 属性,包含更新过程中发生错误时的异常信息。

Private Sub Update_UpdateCompleted(ByVal sender As Object, _
ByVal e As AsyncCompletedEventArgs
If Not e.Cancelled Then
If (e.Error Is Nothing) Then
‘Update was successful.
Else
‘Error occurred during update.
End If
Else
‘Update was cancelled.
End If
End Sub
返回页首返回页首

小结

使用 ClickOnce,部署和更新胖客户端应用程序与部署和更新 Web 应用程序一样简单和容易。使用 Visual Studio 2005 中提供的工具,向应用程序添加 ClickOnce 功能非常简单。构建自定义更新解决方案的编程模型功能强大而且相当简单,它为处理各种部署方案提供足够的空间。最后,可能也是最重要的一点,使用内置于 ClickOnce 中的安全功能,您提供的应用程序不仅功能丰富,而且便于部署和维护,同时还可以获得 .NET Framework 提供的保护。

虽然 Visual Studio 2005 和 .NET Framework 2.0 引入了一种简单且易于使用的声明性模型,用于通过 ClickOnce 部署应用程序,但它不是万能的。对于更复杂的应用程序安装(可能需要部署共享组件,或需要对计算机系统进行具有重要影响的其他更改),紧密集成到所有现代 Windows 操作系统中的 Microsoft Windows Installer 技术为您提供了强大的功能和灵活性,用于构建可靠和高度可自定义的安装程序。

posted on 2006-10-07 14:03  天使爱比目鱼  阅读(2722)  评论(0编辑  收藏  举报