如何在不使用 IDE 的情况下构建、签名并部署 ClickOnce 应用程序
如何使用完整的可运行示例,在不使用 Visual Studio IDE 的情况下发布 ClickOnce 应用程序。
引言
ClickOnce 应用程序是无需在客户端计算机上实际安装应用程序即可通过 Internet 交付应用程序的绝佳方式。但是,让 ClickOnce 应用程序能够部署和更新也带来了挑战,特别是当您无法依赖 Visual Studio IDE 来发布应用程序时。
背景
VS IDE 会为您发布 ClickOnce 应用程序;但是,许多人无法依赖此功能,因为他们需要使用命令行工具才能在生产环境中自动部署应用程序。不幸的是,命令行 MSBUILD 工具尚不具备发布 ClickOnce 应用程序的功能。唯一其他发布方法是使用 Mage 工具。但是,在撰写本文时,命令行版本缺少一些关键功能,而 Microsoft 提供的文档也远远不够。这个可运行示例是我和几位 Microsoft 工程师经过数小时研究的结果。希望它能帮助您开始部署应用程序。
附带的 zip 文件包含一个包含两个项目的解决方案。MyApp 是一个 ClickOnce 应用程序,仅用于从网站启动。该应用程序实际上从未安装在客户端计算机上(好吧,并非真正如此,但我稍后会对此进行讨论)。理念是您的应用程序**必须**从 Web 浏览器启动。您为什么要这样做?假设您想让客户端运行一个与 Internet 上的服务或数据库通信的应用程序。如果他们已经从您的网站进行了身份验证,您就可以通过直接从您的网站启动应用程序,来防止用户在 ClickOnce 应用程序中再次进行身份验证。Citrix 的 GotoMeeting 就是这样做的,碰巧它也是一个 ClickOnce 应用程序。MyWebSite 是一个简单的 ASP.NET 项目,用于托管 MyApp。
一些人可能会遇到的 ClickOnce 应用程序问题是更新以前安装的 ClickOnce 应用程序。等等;我不是刚说过 ClickOnce 应用程序未安装在客户端计算机上吗?事实是,“仅在线”应用程序会被缓存,这样您就不必每次都下载应用程序。缓存位置位于用户**AppData** 文件夹内,通常类似于
C:\Users\fasttimes\AppData\Local\Apps\2.0
您可以在此处随意查找 ClickOnce 应用程序的存储位置,但通常删除此目录的内容以清除缓存是安全的。
正如我之前所说,另一个问题是 Mage 命令行工具本身。它缺少一个映射文件扩展名的选项,另一个选项允许您的应用程序接受 URL 参数。我希望 Microsoft 在 Mage 的未来版本中能纠正这些不足之处。
我不会深入探讨这些“缺失”选项的细节,而是解释我如何绕过这个问题。要部署 ClickOnce 应用程序,您需要创建一个清单文件,其中列出了所需的文件以及用于启动应用程序本身的文件。为了进一步增加复杂性,您**必须**使用证书密钥为每个文件签名。我在使用 Mage 的命令行版本时发现的问题是,当它创建应用程序启动文件(在我的演示中称为 *MyApp.application*)时,它缺少一些设置。由于该文件只是一个 XML 文档,我使用了一些批处理文件命令和 Unix 命令 SED 的 DOS 版本来添加那些缺失的部分。在此文件修改后,除了应用程序文件和清单之外,所有要分发的文件都会被添加“.deploy”扩展名。如果未执行此步骤,则任何支持文件(如 DLL 或图标)都不会被下载,您的程序将无法启动。完成所有这些工作后,应用程序文件会使用证书进行签名,然后文件就可以进行分发了。
使用代码
虽然我的演示已准备就绪,但如果您要从头开始构建自己的 ClickOnce 应用程序,请务必在项目属性的安全选项卡中选中“**启用 ClickOnce 安全设置**”复选框。否则,您的应用程序将无法在客户端计算机上运行。
运行演示非常简单。启动 VS 命令提示符(或确保 msbuild.exe 和 mage.exe 的路径在您的环境变量中)。使用 build.bat 文件编译解决方案。如果您愿意,也可以启动 ClickOnceDemo.sln 解决方案文件并从中进行构建,但我个人想要一种 100% 命令行方式来构建和发布。接下来,运行 CreateClickOnce.bat 文件,并提供应用程序的版本号(使用四个有效数字 #.#.#.#)和您的网站名称。第二个参数实际上并非必需,但我添加了它,因为您可能希望在不同版本的网站中使用相同的应用程序。由于一次客户端计算机上只能有一个应用程序实例,您可以通过更改使用的名称来绕过此问题。如果您想了解其工作原理,可以仔细查看批处理文件。
重要的是要注意,您每次调用此批处理文件时都需要递增版本号,否则 ClickOnce 安装程序将认为它已经拥有最新版本而不会下载更新。在自动环境中,我使用 FinalBuilder 等其他代码和应用程序。
构建和运行演示需要运行两个批处理文件,如下所示。请注意,CreateClickOnce 批处理文件执行了所有“Mage 魔术”,并使用了 SED 命令(也包含在内)。它还将所有 ClickOnce 文件复制到 MyWebSite\published 目录。
C:\ClickOnceDemo>build
.
.
.
C:\ClickOnceDemo>CreateClickOnce 1.0.0.0 Test
从 IDE 运行 **MyWebSite**,或者创建一个指向该目录的虚拟目录并进行浏览。通过按下按钮启动 ClickOnce 应用程序。更改参数并再次尝试。
现在,在 IDE 中打开解决方案,向 ClickOnce 应用程序添加一个新按钮并保存文件。再次运行这两个批处理文件,然后进行测试。如果您的更改未出现,您可能忘记在调用 CreateClickOnce 时递增版本号。如果您第一次调用时使用的是 1.0.0.0,请尝试再次调用 1.0.0.1,您的更新应用程序应该可以运行。
历史
- 2009 年 8 月 29 日 – 首次发布。