使用 ClickOnce 部署Windows 窗体应用程序
毛罗·桑特安娜
Microsoft 区域总监
2004 年 12 月
摘要:检查 ClickOnce 技术,将其与其他部署技术进行比较,并演示如何在应用程序中使用它。 ) (11 个打印页
简介
ClickOnce 是 Visual Studio 2005 附带的新 Windows 窗体部署技术。 它支持使用智能客户端轻松安装和升级 Web 应用程序。 自 .NET Framework的第一个版本以来,通过 HTTP 部署Windows 窗体应用程序一直可用,此后一直在不断发展。 本文讨论Windows 窗体应用程序的优点,以及导致 ClickOnce 的此技术的发展。 我还将演示一个使用 Visual Studio 2005 公共 Beta 版 1 的简单示例。
为什么Windows 窗体?
自万维网出现以来,大多数用户和开发人员对 Web 应用程序比对“常规”Windows 应用程序更感兴趣。 除了“冷度因素”之外,Web 应用程序还具有一些有趣和特殊的特征:
- 可以从世界上任何有 Internet 连接的地方访问 Web 应用程序;客户端甚至不需要运行 Windows。 当应用程序需要无处不在的访问时,“纯 Web”应用程序是一项非常好的技术。
- Web 应用程序易于部署和更新:只需将应用程序文件复制到 Web 服务器上的目录中,所有客户端就可以立即开始使用新应用程序。 没有 DLL,没有要纠缠的注册表项,没有要注册的 COM 类;它只是工作!
本文重点介绍上面的第二个项目符号:部署。 与传统的 Windows 应用程序部署不同,Web 应用程序使用的 HTTP 协议具有多种优势。
另一方面,虽然我喜欢 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 。前任
.NET Framework 1.0 和 1.1 版“现成”,能够通过 HTTP 部署Windows 窗体应用程序。 基本上使用“HREF”标记指向托管.EXE。 Internet Explorer 和 .NET Framework 运行时不仅可以按需下载并运行可执行文件,还可以下载并运行它可能需要的 DLL。 这种部署被昵称为“hrefing EXE”。
下面是此类标记的一个示例:
<a href="MainProject.exe">Call MainProject</a>
这很容易做到,建议的文章中对此进行了讨论:
- Windows 窗体引擎中的安全和版本控制模型帮助你创建和部署由 Chris Sells 提供的智能客户端;另请参阅他的智能客户端 Wahoo! 示例
- 浏览器死亡?
- 我的文章在 Web 上部署Windows 窗体
- 在 Internet Explorer 中使用Windows 窗体控件
由于 .NET 程序集 (.EXE 或 .DLL) 是基本部署单元,因此需要将应用程序拆分为main .EXE和多个 DLL。 这样,如果在单个 DLL 中进行了简单的更改,则只需下载此 DLL。
尽管听起来很简单,但仍有一些技巧可以让事情正常工作:
- The.NET Framework 必须以前安装在客户端 (但可以从 下载插件 https://msdn.microsoft.com/vstudio/downloads/tools/bootstrapper/ ,以便更轻松地安装 Framework 和应用程序) 。
- 应用程序将在客户端上作为部分受信任的代码运行。 一方面,这很好,因为应用程序在沙盒中运行,并且对客户端计算机的用途有限制。 另一方面,如果需要打开本地文件或调用 COM 对象等功能,则必须以某种方式在客户端中设置安全策略,而不是一件小事。
- 默认情况下,可执行文件很可能尝试使用本地化资源加载多个 DLL;由于当前实现中的一些问题,性能将受到影响,尤其是在 Internet 链接缓慢时。
- 更新是逐个文件进行的;例如,无法保证所有 10 个更新的文件确实已下载;客户端可能遇到“半更新”应用程序。
- 仅当用户在 Internet Explorer 中手动设置“脱机工作”时,应用程序才可脱机使用;应用程序本身无法控制它。
- 默认情况下,与程序关联的.config文件不可用, (此处检查如何) 执行此操作。
- 应用程序在桌面或 “开始 ”菜单中没有快捷方式。
更新程序应用程序块
为了解决上面指出的一些问题,Microsoft (UAB) 创建了 Updater 应用程序块 。 updater 块是添加到应用程序的库,用于通过 HTTP 管理应用程序片段的下载。
它比原始框架实现具有一些优势:
- 它作为本地应用程序运行,并且一直可用,不会造成性能损失。
- 汇报事务处理;也就是说,在新版本可用之前,必须成功下载新版本的所有文件。
- 清单中列出了所有应用程序文件。
- 它作为完全信任的应用程序运行;无需使用客户端安全策略。
- 应用程序可以在 “开始 ”菜单上具有快捷方式。
另一方面,也有一些缺点:
- 必须大幅更改应用程序才能使用它。
- 由于它使用 BITS 下载应用程序片段,因此它不会在 Windows 98/ME 下运行;需要 Windows 2000 或更高版本。
- 它作为完全信任的本地应用程序运行,因此它几乎忽略了代码访问安全性。
- Microsoft 不支持它。
若要获取有关 UAB 的详细信息,请参阅 Jamie Cool 的 .NET 应用程序更新程序组件。 你还可以在 Gotdotnet 检查 UAB 的主页。 UAB没有“正式”支持,尽管 www.gotdotnet.com 有一个论坛。 在任何情况下,UAB 附带完整的源代码,你可以更改它以修复其某些限制,例如 BITS 和 Windows 2000 的要求。
ClickOnce
当 Microsoft 开发明确的解决方案时,UAB 显然是一项临时措施。 此解决方案为 ClickOnce。 基本上,ClickOnce 具有 UAB 的所有优势,几乎没有问题, 外加 一些新增功能。 在我看来,ClickOnce main优势之一是它可以恢复代码访问安全性。
与 HREF EXE 相比,ClickOnce 应用程序具有以下优势:
- 汇报是交易 (即,要么完全完成,要么根本不) 。
- 应用程序不仅可以脱机工作,还可以对它进行一定程度的控制;有 API,以便应用程序可以确定它是联机还是脱机;它还可以控制自己的更新过程;
- 它与 Visual Studio .NET 有很好的集成,包括能够生成适当的额外文件和工具,以帮助确定应用程序需要哪些安全特权才能运行。
- 它附带一个 Win32“bootstraper”可执行文件,可以下载必要的组件,甚至.NET Framework本身。
- 可以按需或批量下载应用程序文件;
- 它可以具有 “开始” 菜单快捷方式;
ClickOnce 是 Visual Studio 2005 的一项功能,以前代号为“Whidbey”,.NET Framework 2.0。 让我们使用“社区预览版 Beta 1” (Framework 版本 2.0.40607) 来探索一个示例。
ClickOnce 应用程序
让我们按照以下步骤创建一个简单的 ClickOnce 应用程序。
启动 Visual Studio 2005。
选择“ 文件”,然后单击“ 新建项目”。
选择 (C# 或 Visual Basic .NET) 语言,然后选择“Windows 应用程序”。
将项目
MyClickOnceApp
命名为 ,然后单击“确定”。向窗体添加一个按钮,并将其 Text 属性更改为 “关于”。
双击该按钮。 在代码窗口中输入以下代码。
Visual Basic .NET:
MsgBox("My First ClickOnce Application")
C#:
MessageBox.Show("My First ClickOnce Application");
按 F5 运行并测试应用程序。
Visual Studio 2005 下的所有 Windows 应用程序在“项目”下都有一个 “发布” 页 |用于控制部署详细信息的 MyClickOnceApp 属性 :
图 1. 配置发布设置
发布位置 指示应用程序的部署位置。 它可以是 Web 服务器 (HTTP) 位置,如上所示,但也可以是常规网络路径。
安装模式和设置 控制多个部署详细信息,例如:
应用程序是仅联机还是脱机可用。
应用程序文件:将安装单个文件的位置。
先决条件:安装程序是否必须安装其他组件,例如 Windows Installer 2.0、.NET Framework 2.0、J# 可再发行组件包、SQL Server 2005 Express、Crystal Reports 和 Microsoft 数据访问组件 2.8。
图 2. 配置先决条件
汇报:控制应用程序何时应检查更新,以及如何将这些更新引入客户端。
图 3. 配置更新
选项:调整应用程序语言、 “开始” 菜单快捷方式资源名称、用于 Web 部署的 HTML 页面和部署策略票证等详细信息。
图 4。 配置发布选项
发布版本 调整应用程序版本号;可以在每次部署时自动增加版本号。
使用发布向导 可以设置各种发布选项。 此向导也从菜单 生成 | 调用发布。 所有 ClickOnce 应用程序都必须经过加密签名;向导要求提供现有密钥 (建议) ,或者可以生成新密钥。
图 5。 对应用程序进行签名
运行向导一次后,可以单击“ 立即发布 ”以发布更新。 在我们的示例中,将显示一个网页。
图 6。 已发布应用程序
此网页包含一个脚本,用于检查在安装应用程序之前必须安装哪个额外的必备组件包。 如果不存在必备组件,则会在首次运行应用程序时安装该必备组件。
在用户单击 “安装” 链接后,多个对话框可能需要用户的干预,至少在首次运行时是:
- Windows XP SP2 警告
- 软件许可证协议
- 缺少对发布者的签名的验证
部署详细信息
Visual Studio .NET 2005 将为应用程序创建新的 Web,其中包含多个文件和文件夹。
图 7。 部署文件夹
dotnetfx 文件夹包含.NET Framework可再发行组件,当前为 25 MB 的可执行文件。
默认情况下,每次部署应用程序时,Visual Studio 都会增加版本号;每个版本都将获得一个新文件夹,其中包含相应的递增版本号。
.application 文件是 HTML 页中显示的链接的目标publish.htm。 它是一个 XML 文件,其中包含与应用程序的当前版本和数字签名对应的文件夹等信息。
Publish.htm 是一个网页,不仅包含 指向 .application 文件的链接,还包含执行某些版本检查并相应地显示消息的一些客户端脚本。 例如,如果计算机没有.NET Framework,则“安装 MyClickOnceApp”下显示的消息将有所不同。
Setup.exe是一个 Win32 可执行文件,不仅能够安装应用程序,还能够安装所有必需的组件,例如.NET Framework本身和 MDAC 2.8。
每个应用程序文件夹都包含应用程序的文件和清单文件。 清单是一个 XML 文件,基本上包含以下信息:
- 所有应用程序文件的精确标识。 此标识包括文件名、版本号、区域性和处理器体系结构,在本例中 (“msil”) 。
- 应用程序所需的所有权限。
- 数字签名。
运行应用程序
下载应用程序后,无需再次下载即可运行该应用程序。 在我们的示例中,可以通过单击指向网页的链接或 “开始 ”菜单中的快捷方式来启动应用程序。 在这两种情况下,根据应用程序汇报项目选项上的设置检查是否存在新版本。 如果需要,将下载新版本。
若要检查此更新功能,请执行以下操作:
- 对应用程序进行可见更改,例如更改窗体上按钮的位置。
- 重新生成并部署它。
- 运行应用程序并检查下载过程。
最后请注意,请务必注意此信息基于 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 Shell 集成 | X | X | |
很好地控制更新过程 | X | X | |
用于脱机工作和控制下载过程的 API | X | ||
可选包的自动安装 | X |
(*) 需要用户干预
(**) 说 beta 版产品为时过早
结论
ClickOnce 是一种非常强大的应用程序部署技术。 这是以前提供的部署模型的自然演变,将可靠性、安全性、性能和灵活性结合到Windows 窗体应用程序的丰富客户端体验。
关于作者
Mauro Sant'Anna (mas_mauro@hotmail.com) 是 MICROSOFT 区域总监、MCSD、MCSE、开发人员和培训师。 他是自2000年奥兰多PDC公开亮相以来,in.NET 的“第一小时”信徒。