C#中windows的clickonce部署

本文由niuqingpi贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
应用程序: 应用程序:使用 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 站点(请参见 https://www.360docs.net/doc/8b16880433.html,/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 程序集(带有源代码),供开发人员为应用程序添加自助更新功能。(请参见 https://www.360docs.net/doc/8b16880433.html,/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 Remo

ve 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 部署项目类型 项目 安装项目 Web 安装项目 合并模块项目 CAB 项目 类型目的 为基于 Windows 的应用程序构建安装程序 为 Web 应用程序构建安装程序 可由多个应用程序共享的包组件 为下载到旧式 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 不时出现,这对于报告大型应用程序的安装进 度或在一个较

相关主题
相关文档
最新文档