Mauro Sant'Anna Microsoft Regional Director
摘要:查看 ClickOnce 技术、将其与其他部署技术进行比较以及展示如何在应用程序中使用该技术。
简介
ClickOnce 是 Visual Studio 2005 中即将包含的全新的 Windows 窗体部署技术。该技术使用智能客户端简化 Web 应用程序的安装和升级。自 .NET Framework 的第一个版本以来,Windows 窗体应用程序部署就一直可以通过 HTTP 进行,并且自那时起就一直处于发展之中。本文讨论了 Windows 窗体应用程序的优势以及引发 ClickOnce 出现的窗体应用程序的技术进展。我还将使用发布的 Visual Studio 2005 Beta 1 版展示一个简单的示例。
为什么要使用 Windows 窗体?
由于万维网的出现,大多数用户和开发人员都对 Web 应用程序比“常规的” Windows 应用程序表现出更大的兴趣。除了“酷炫因素”之外,Web 应用程序还具有一些引人入胜的特殊特性:
• | 在全球任何具有 Internet 连接的地方,都可以访问 Web 应用程序,客户端甚至不需要运行 Windows。当您的应用程序需要常见的访问时,“纯 Web”应用程序是一种非常好的技术。 |
• | Web 应用程序易于部署和更新:只需要将应用程序文件复制到 Web 服务器的目录中,您的所有客户端可以立即开始使用新的应用程序。没有 DLL 地狱、没有纠缠不清的注册表项、没有需要注册的 COM 类,它就能很好地工作! |
本文重点讨论上述第二项:部署。Web 应用程序使用的 HTTP 协议相对于传统的 Windows 应用程序部署具有多种优势。
另一方面,正如我热爱 Web 一样,很难说用户对 Web 的体验是第一流的。与 Windows 应用程序相比,Web 应用程序也存在几个不足之处:
• | 其用户界面非常简单。在 Windows 应用程序中一些理所当然的功能(如拖放和右键单击鼠标),在 Web 应用程序中也非常难于操作甚至不能实现。 |
• | 即使我们要设法实现丰富的界面技巧,也通常需要大量的客户端脚本(一种非常难编写和调试的代码)。 |
• | Web 应用程序使用大量的服务器资源、带宽以及用户的耐心,因为大部分事情都在服务器上执行,需要往返行程和等候。 |
• | 打印也受到“打印屏幕技术”的限制,由于字体、页边距以及纸张大小不同,对许多操作(如分页)都几乎不能控制。 |
• | 尽管其中有些问题可以通过使用插件或 ActiveX 控件得到缓解,但是反过来又可能存在一些部署问题,它们与非 Web 应用程序过去常有的部署问题相同。 |
如果我们将 Web 应用程序的易于分发与 Windows 应用程序的丰富客户端体验相结合,将会怎么样?好,我们可以将它们相结合。从 .NET Framework 的第一个版本起,它就允许通过 HTTP 分发 Windows 窗体应用程序,而没有出现常见的问题。
这种类型的应用程序尤其适用于不要求常见访问的 Intranet/Extranet 环境,我们假设最终用户的计算机都将安装有 Internet Explorer 和 .NET Framework。
.NET Framework 1.x: HREFing .EXEs
.NET Framework 1.0 和 1.1 版都是“开包即用”,能够通过 HTTP 部署 Windows 窗体应用程序。您只要使用 "HREF" 标记指向托管的 .EXE。Internet Explorer 和 .NET Framework 运行库可以按需下载并运行可执行文件及其所需的 DLL。这种类型的部署昵称为“hrefing EXE”。
以下是这种标记的一个示例:
<a href="MainProject.exe">Call MainProject</a>
标记非常简单,推荐参阅以下几篇文章,它们已经对此进行了讨论:
• | Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients 作者:Chris Sells;也可以参阅他的 smart client Wahoo! sample |
• | Death of the Browser? 作者: Billy Hollis |
• | 我的文章 Deploy Windows Forms on the Web |
• | Using Windows Forms Controls in Internet Explorer |
因为 .NET 程序集(.EXE 或 .DLL)是基本的部署单元,所以您要将应用程序拆分成主 .EXE 和多个 DLL。这样,如果对单个 DLL 进行简单修改,则只需要下载此 DLL。
听起来似乎很容易,但是要使其正确工作,仍然需要一些技巧:
• | 客户端上此前必须已经安装了 .NET Framework(尽管可以从 http://msdn.microsoft.com/vstudio/downloads/tools/bootstrapper/ 下载插件,使安装 Framework 和您的应用程序变得更简单)。 |
• | 您的应用程序将作为部分受信任的代码在客户端上运行。一方面,这样做非常合适,因为应用程序在沙箱中运行,而且可限制它对客户端计算机的操作。另一方面,如果需要诸如打开本地文件或调用 COM 对象等功能,则必须以某种方式在客户端上设置安全策略,这一点很重要。 |
• | 默认情况下,可执行文件很有可能试图加载多个含有本地化资源的 DLL;由于当前实现中的某些问题,性能将会受到影响(尤其在较慢的 Internet 链接中)。 |
• | 更新以文件到文件为基础进行;例如,无法保证确实已下载了全部 10 个更新文件;客户端可能无法摆脱“半更新的”应用程序。 |
• | 只有用户在 Internet Explorer 中手动设置为“脱机工作”时,才能脱机使用应用程序;应用程序本身不能对其进行控制。 |
• | 默认情况下,不能使用与程序关联的 .config 文件(单击此处了解如何使用)。 |
• | 您的应用程序不会在桌面或 Start 菜单中添加快捷方式。 |
更新应用程序块
为了解决以上提出的一些问题,Microsoft 创建了 更新应用程序块 (UAB)。该更新块是一个库,您可以将其添加到应用程序中,这样,就可以通过 HTTP 管理应用程序块的下载。
有别于最初的 Framework 实现,它具有以下一些优势:
• | 它作为本地应用程序运行,并且可在任何时候使用,不会对性能造成影响。 |
• | 更新是事务处理,即在新版本可用之前必须成功下载所有新版本的文件。 |
• | 所有应用程序文件都以清单形式列出。 |
• | 它作为完全受信任的应用程序运行,您不需要调整客户端安全策略。 |
• | 您的应用程序会在 Start 菜单上添加快捷方式。 |
另一方面,还有一些不足:
• | 为了使用应用程序,您必须对其进行较大的修改。 |
• | 由于使用 BITS 下载应用程序块,因此它不能在 Windows 98/ME 中运行,而只能在 Windows 2000 或更高版本中运行。 |
• | 它作为完全受信任的本地应用程序运行,因此,它几乎忽略代码访问的安全性。 |
• | Microsoft 没有为它提供支持。 |
有关 UAB 的更多信息,请参阅 Jamie Cool 撰写的 .NET Application Updater Component。您也可以参阅 Gotdotnet 上的 the home of the UAB。虽然 UAB 没有获得“官方的”支持, 但是 www.gotdotnet.com 网站上有一个论坛。无论如何,UAB 带有完整的源代码,您可以对其进行修改,以修补其中的一些限制(如需要 BITS 和 Windows 2000)。
ClickOnce
很明显,UAB 只是一种过渡措施,期间 Microsoft 开发了一个最终的解决方案。此解决方案就是 ClickOnce。ClickOnce 基本上具有 UAB 的所有优势,但却几乎没有其不足,而且还外加 了一些新增功能。在我看来,ClickOnce 的一个主要优势就是它恢复了代码访问的安全性。
与 HREF EXE 相比,ClickOnce 应用程序具有如下优势:
• | 更新是事务处理(即,要么完全执行,要么根本不执行)。 |
• | 该应用程序不但可以脱机工作,而且还可以对其进行某种程度的控制;有一些 API 可使应用程序发现它是联机或脱机;它还可以控制其自身的更新过程; |
• | 它可以与 Visual Studio .NET 进行良好的集成,包括能够生成合适的额外文件和工具,帮助您找到运行应用程序所需的安全权限。 |
• | 它具有一个可下载必需组件(甚至 .NET Framework 自身)的 Win32“bootstraper”可执行文件。 |
• | 可以按需要或以批处理方式下载应用程序文件; |
• | 它可在 Start 菜单中添加快捷方式; |
ClickOnce 是 Visual Studio 2005(以前的开发代码名为“Whidbey”)和 .NET Framework 2.0 的一个功能。让我们来看使用“Community Preview Beta 1”(Framework 2.0.40607 版)的一个示例。
一个 ClickOnce 应用程序
我们遵循以下步骤来创建一个简单的 ClickOnce 应用程序。
1. |
启动 Visual Studio 2005。 |
2. |
选择 File,然后单击 New Project。 |
3. |
选择一种语言(C# 或 Visual Basic .NET)并选定 Windows 应用程序。 |
4. |
将项目命名为 MyClickOnceApp 并单击“确定”。 |
5. |
向窗体中添加一个按钮,并将其 Text 属性更改为 About。 |
6. |
双击该按钮。在代码窗口中输入以下代码。 Visual Basic .NET: MsgBox("My First ClickOnce Application") C#: MessageBox.Show("My First ClickOnce Application"); |
按下 F5 键运行并测试应用程序。
在 Visual Studio 2005 中,所有的 Windows 应用程序在 Project | MyClickOnceApp Properties 中都有一个 Publish 页,可控制部署详细信息:
Publishing Location 表示将从其部署应用程序的位置。它可以是一个 Web 服务器 (HTTP) 位置(如前所示),但是,也可以是一个常规的网络路径。
Install Mode and Settings 控制多种部署详细信息,例如:
• | 应用程序是仅支持联机使用还是也支持脱机使用。 |
• | Application Files:单个文件的安装位置。 |
• | 前提条件:安装程序是否必须安装其他组件,例如 Windows Installer 2.0、.NET Framework 2.0、J# Redistributable Package、SQL Server 2005 Express、Crystal Reports 以及 Microsoft Data Access Components 2.8。 |
• | Updates:控制应用程序应在何时检查更新以及如何向客户端提供这些更新。 |
• | 选项:调整详细信息,例如应用程序语言、Start 菜单快捷方式资源名称、用于 Web 部署的 HTML 页以及部署策略票据。 图 4. 配置发布选项 |
Publish Version 调整应用程序版本号;每次部署时版本号可以自动增加。
Publish Wizard 允许设置不同的发布选项。该向导还可以通过 Build | Publish 菜单调用。所有的 ClickOnce 应用程序必须以加密方式进行签名;该向导请求一个现有密钥(推荐)或生成一个新密钥。
在运行一次该向导之后,就可以单击 Publish Now 发布更新。在我们的示例中将显示一个 Web 页。
该 Web 页包含一个脚本,它检查在安装应用程序之前必须安装哪一个额外的“前提条件”安装包。如果没有“前提条件”,则会在应用程序首次运行时安装。
在用户单击 Install 链接后,会出现多个可能要求用户干预的对话框(至少首次运行时要求用户干预):
• | Windows XP SP2 警告 |
• | 软件许可协议 |
• | 缺少发布方签名认证 |
部署详细信息
Visual Studio .NET 2005 将为应用程序创建一个具有多个文件和文件夹的新 Web。
图 7. 部署文件夹
dotnetfx 文件夹包含可重新发布的 .NET Framework(目前为一个 25 MB 的可执行文件)。
默认情况下,Visual Studio 将在每次部署应用程序时增加版本号;每个版本将获得一个与增加版本号相对应的新文件夹。
.application 文件是 HTML 页 publish.htm 中显示链接的目标。它是一个包含信息(如与应用程序当前版本和当前数字签名相对应的文件夹)的 XML 文件。
Publish.htm 是一个 Web 页,不仅包含指向 .application 文件的链接,而且包含一些客户端脚本可以进行某些版本检查并显示相应的信息。例如,如果您的计算机没有 .NET Framework,Install MyClickOnceApp 将会显示不同的消息。
Setup.exe 是一个 Win32 可执行文件,不仅可以安装应用程序,而且可以按正确的次序安装必需的组件(如 .NET Framework 自身和 MDAC 2.8)。
每个应用程序文件夹包含应用程序的文件和清单文件。清单是一个 XML 文件,主要包含如下信息:
• | 所有应用程序文件的确切身份。该身份包含文件名、版本号、区域性以及处理器体系结构(本示例中为“msil”)。 |
• | 应用程序所需的所有权限。 |
• | 数字签名。 |
运行应用程序
应用程序下载完成后,可以运行它而不用再次下载。在我们的示例中,可以通过单击指向 Web 页的链接或 Start 菜单中的快捷方式启动应用程序。在这两种情况下,根据 Application Updates 项目选项中的设置可以检查是否存在新版本。需要时可以下载新版本。
要检查更新功能,请按如下步骤操作:
1. |
对应用程序进行一次可见的更改,例如更改窗体上按钮的位置。 |
2. |
再次构建按钮并部署。 |
3. |
运行应用程序并检查下载过程。 |
最后请注意:该信息是基于 Visual Studio .NET Beta 1 版的,这一点非常重要;新版本可能具有不同的功能。
比较图表 | |||
HREF .EXE | UAB | ClickOnce | |
应用程序不要求更改 |
X |
|
X |
应用程序隔离 |
X |
|
X |
完全支持 |
X |
|
X |
较低的系统影响 |
X |
|
X |
保留代码访问安全 |
X |
|
X |
按需文件下载 |
X |
|
X |
以声明方式列出的必需文件的清单 |
|
X |
X |
以加密方式签名的清单 |
|
|
X |
批处理文件下载 |
|
X |
X |
脱机工作 |
(*) |
X |
X |
事务处理安装 |
|
X |
X |
最佳性能 |
|
X |
X |
Windows 2000 或更高版本要求 |
|
X |
(**) |
Windows 外壳集成 |
|
X |
X |
对更新过程的正确控制 |
|
X |
X |
脱机工作和控制下载过程的 API |
|
X |
X |
可选包的自动安装 |
|
|
X |
(*) 要求用户干预
(**) 对测试版产品来说还为时过早
小结
ClickOnce 是一种功能非常强大的应用程序部署技术。它是以前所用的部署模式的自然发展,为具有丰富客户端体验的 Windows 窗体应用程序提供了可靠性、安全性、性能和灵活性。
关于作者
Mauro Sant'Anna ([email protected]) 是 Microsoft 的一名区域经理,MCSD、MCSE、开发人员和培训师。自从.NET 在奥兰多 PDC 2000 上公开发布以来,他是第一个信徒。
转到原英文页面