相比Windows Installer安装程序,ClickOnce的优势在于自动更新,以及安全性方面。
对于自动更新,可以在发布的时候配置,也可以直接以Code形式在代码里调用ApplicationDeployment API定制更新,非常灵活。
安全性方面,摘录MSDN上的一段话:
使用 ClickOnce 技术部署的应用程序运行在“沙箱”中,这些应用程序享有的权限受到安全区域的限制。下表列出基于部署位置的默认权限:
部署位置 |
安全区域 |
---|---|
从 Web 运行 |
Internet 区域 |
从 Web 安装 |
Internet 区域 |
从网络文件共享安装 |
Intranet 区域 |
从 CD-ROM 安装 |
完全信任 |
默认权限取决于部署初始应用程序版本的位置;应用程序的更新将继承这些权限。如果将应用程序配置为从 Web 或网络位置检查是否有更新且存在较新的版本,则初始安装可以获得 Internet 或 Intranet 区域的权限,而不是完全信任权限。如果不想让系统提示用户,系统管理员可以指定一个 ClickOnce 部署策略,将某个特定的应用程序发行者定义为受信任的来源。对于部署此策略的计算机,系统会自动授予权限而不会提示用户授予权限。
ClickOnce技术受客户端支持,也就是说,客户端必须安装.net framework2.0以上。而对服务器没啥要求,只要能放发布后的目录就行,并且要保证远程客户端能够下载发布的所有文件,比如在 Windows Server 2003 上使用 Internet 信息服务 (IIS),并且部署中包含 Windows 不识别的文件类型,如 Microsoft Word 文件,则 IIS 将拒绝传输该文件,因而部署无法成功完成。
ClickOnce的自动更新下载的是Change Set程序集,而非所有程序集。我们都知道,VS已经集成了ClickOnce发布功能,但值得注意的是,该发布功能采用的Publish命令,而Publish命令是msbuild命令的超集,这意味着什么呢?即每次发布都将重新编译整个项目,也就是说,当你更新下一个版本的时候会下载全部程序集。显然,这违背了我们的初衷,因此引出了手动部署ClickOnce的概念,微软提供了mage.exe(mageui.exe)工具以支持手动部署ClickOnce应用程序,该工具的使用在MSDN上有详细的说明。
如果mageui.exe还不能满足需求,比如,在发布后要自动注册程序集的权限到远程服务,我们可以围绕mage命令开发一个适用的发布工具。
最后一点,手动发布的程序集在编译前必须勾上Enable ClickOnce Security Settings选项(在项目属性的Security选项卡中),否则在下载安装该程序集的时候会出现类似“Reference in the manifest does not match the identity of the downloaded assembly...”的错误提示
待发布项目中如果包含数据文件,ClickOnce在版本更新中是如何处理的呢?请参阅在 ClickOnce 应用程序中访问本地数据和远程数据
但是令人遗憾的是,手动部署ClickOnce并不能做到象VS的发布一样连同.net Framework一起发布,至少目前我还没找到相关解决方案。
如有疑问,请参阅ClickOnce 部署疑难解答