ClickOnce部署Winform程序的方方面面
使用ClickOnce发布Winform程序将使得程序的部署变得非常的方便,这篇文章就来介绍下ClickOnce的使用和部署过程中可能遇到的问题,权当梳理知识、日后备用。
内容概览
1. ClickOnce简介
微软官方对ClickOnce的解释是:ClickOnce 是一项部署技术,您可以利用这项技术来创建基于 Windows 的自行更新的应用程序,并且安装和运行这类应用程序所需的用户交互最少。
使用用ClickOnce主要解决了程序部署中的几个问题:
- 更新应用程序困难。使用 Microsoft Windows Installer 部署,每次更新应用程序时,用户都可以安装更新(msp 文件)并将其应用到已安装的产品中;使用 ClickOnce 部署,可自动提供更新。只有更改过的应用程序部分才会被下载,然后会从新的并行文件夹重新安装完整的、更新后的应用程序。
- 对用户的计算机的影响。使用 Windows Installer 部署时,应用程序通常依赖于共享组件,这便有可能发生版本冲突;而使用 ClickOnce 部署时,每个应用程序都是独立的,不会干扰其他应用程序。
- 安全权限。Windows Installer 部署要求管理员权限并且只允许受限制的用户安装;而 ClickOnce 部署允许非管理用户安装应用程序并仅授予应用程序所需要的那些代码访问安全性权限。
简单点说就是ClickOnce部署的程序可以自动更新,近乎绿色,且对程序的权限执行权限拥有更细的粒度。
下面是ClickOnce的基本架构图(图片来源)
2. 发布站点建立
我们先来看一下使用ClickOnce部署Winform程序后的发布界面,只要点击Install即可从部署的服务器下载程序安装运行了。
所以这里涉及到站点的建立,在Web服务器上建立一个站点以供发布新的ClickOnce包。
在建立站点前,我们需要如下图确认这两个组件是否已经启用。
启用后,建立一个站点,路径选择一个自己建立的空目录即可,其他的Web服务器的设置这里不再赘述。
3. 配置ClickOnce程序
在Winform项目上右键打开属性界面,配置好相关的编译属性,关于编译属性的详细配置可以参见前一篇文章:关于Winform编译配置那些事。
切换到发布标签,如下图所示。
在发布目录里面,可以选择Web、FTP、文件路径模式,这里我们填上我们之前配置好的空的Web站点即可。
在安装模式里面,支持两种安装模式:联机或脱机可用性。一般我们选择用户即使在断线的情况下也能使用发布的应用程序。
点击“程序文件”,打开对话框。
这里可以选择哪些文件可以发布到ClickOnce中,以便发布到客户端里面。
默认是将程序编译出的文件包含在ClickOnce包中,这里会遇到一个问题:如何将其他文件如一些说明文档在项目里更新后同时自动打包进部署包里。
比如我们在项目里面添加了一个Readme.txt,默认在我们发布新包时此文件是不会发布进去的。
如果我们需要每次发布进去,只要在Readme.txt上右键打开属性,配置这两个值即可。
而在必要组件对话框里面,ClickOnce会自动分析出需要的必要组件,当然你也可以自己选择必要组件,并可以配置是从供应商的页面下载组件、从我们自己配置的发布路径下载或者其他路径。
使用ClickOnce发布的程序一个最大的特点就是能够自动更新,即当运行的时候发现发布服务器上有新版本后即会自动更新后再运行,当然更新的策略也可以配置,我们打开“更新”对话框。
可以选择在程序启动前还是启动后更新程序。
或者按照时间间隔去检查更新并更新程序。
或者强制用户更新到某个版本。
也可以配置更新包在其他某个路径。
打开“属性”对话框,可以设置一些发布的基本属性。
如发布人、套件名称、程序名称等等,这里的一些设置会影响到部署页面的信息和用户安装后的目录。
当然这里还可以设置如:刻录成CD安装包后是否插入CD就自动运行,是否用户安装后在桌面创建快捷方式等等,可以自己去点开设置自己需要的东西,就不一一介绍了。
还可以设置是自动增加版本号还是自己设置,这里的版本号设置最好遵照版本号的使用原则,否则后期维护起来会很混乱,好的习惯往往会让你事半功倍。
4. 发布ClickOnce包
在发布前,我们再说两个东西,那就是代码访问安全和程序签名。
- 代码访问安全:ClickOnce 应用程序受 .NET Framework 中代码访问安全性约束的限制,以帮助限制代码访问受保护的资源和操作的权限。 因此,了解代码访问安全性的含义以相应地编写 ClickOnce 应用程序是十分重要的。 您的应用程序可以使用完全信任或使用部分区域(如 Internet 区域和 Intranet 区域)来限制访问权限。
- 程序签名:ClickOnce 使用证书验证应用程序发行者的真实性,并使用证书为应用程序和部署清单签名,以证明文件未被篡改。 签名是一个可选的步骤,它会使在生成清单以后更改应用程序文件更容易。 然而,在没有签名清单的情况下,很难确保应用程序安装程序在受到中间人安全攻击时不被篡改。 出于这个原因,我们建议您对应用程序清单和部署清单进行签名,以帮助保护您的应用程序。
这部分的解释和详细介绍可以看MSDN里面的保护应用程序章节。
然后点击发布按钮即可,发布成功后IE会自动打开发布好的页面,你只需要将发布的地址给需要安装此程序的客户就可以轻松完成程序的部署了。
5. 问题补遗
- 关于签名过期的问题可以参考园友许海彪的这篇文章:解决ClickOnce签名过期问题。
- 关于ClickOnce信任文件大小的问题,修改注册表HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment
做成一项“OnlineAppQuotaInKB”的DWROD值即可。
6. ClickOnce的一个缺点
ClickOnce使用下来我觉得一个最大的缺点就是不让用户选择安装的问题,默认会放在当前用户的 Documents and Settings 文件夹中 Local Settings 目录下的一系列隐藏目录。
设计的初衷是为了为应用程序存储提供一个位置,ClickOnce从用户那里接管了管理应用程序物理安装的任务。 通过对所有应用程序及其不同版本的程序集和数据文件进行独立保存,缓存还有助于隔离应用程序。
这样限制了ClickOnce的部署路径就很大方面限制了对ClickOnce的选择使用,真希望微软能把这个功能点改进掉。
希望你看到这个缺点的时候不要心底一凉,就像我当时发现有这个缺点时候的心情,按需选择就好。 :)