none
ClickOnce 更新部署问题 RRS feed

  • 问题

  • 用clickonce部署,每次都需要把所有的文件部署一次,如果文件很多,每次更新,都要把所有的 文件全部下载一次。怎么才能只部署更新的文件,下载时只下载更新的文件,其他的从上一个版本继承

     

    还有一个问题: 如果服务器有新版本发布,我第一次启动会提示更新,如果你选skip,然后关闭应用程序。如果再启动程序时,不再会提示。我希望再次提示。

    2008年4月10日 2:09

答案

  • ClickOnce只能满足大部分部署要求。如果需要特定的行为,只能靠ClickOnce提供的类进行自定义了。

    对于第二个问题,如果更新提示被skip掉了,你没法控制让它在下次启动的时候自动再提示一次(它在你的程序之外),但是可以手工编写代码在你的程序内部来实现。

    你可以利用System.Deployment.Application类(在System.Deployment.dll中),利用CheckForUpdateCheckForUpdateAsync方法检测服务器上是否有新版本,然后给用户提示,然后可以通过UpdateUpdateAsync 来安装更新。更多的功能,你可以查询MSDN上关于System.Deployment.Application的功能说明以及各种属性和方法列表:

    http://msdn2.microsoft.com/zh-cn/library/system.deployment.application.aspx

    对于第一个要求,貌似目前默认的支持无法实现,需要自己仔细规划和实现自己的更新逻辑。也就是说,第一次安装可以利用ClickOnce,随后的版本更新完全依靠自己实现这种只更新个别文件的机制。

    对于按需更新,我记得是对于同一个版本的文件,按照需要决定是否需要下载,而不是针对不同版本的。

    2008年4月10日 8:36
    版主
  • 我记得通过ClickOnce发布的同一个程序的不同版本存放在不同的目录,因此楼主第一个要求,不完全自定义更新逻辑的话,应该是没办法实现的。

    楼主第二个问题,虽然不能让默认机制第二次显示更新提示,但是可以通过我说的那些类在你程序内部作出更新提示,这也算是一种比较简单的弥补措施吧。

    至于ClickOnce的发布路径、安装路径、更新路径,我记得发布路径就是网站或者IIS虚拟目录的位置就行了,安装路径你没法控制,在一个比较深的路径下,你在系统盘下搜索你的程序的exe文件名能搜到,好像在 系统盘:\Documents and Settings\系统登录名\Local Settings\Application Data\ClickOnce里设置的公司名称 下,应该是每个版本一个目录。

    更新路径好像就是在安装路径下,每个版本一个目录。

     

    另外还有一个“特点”,就是对于登录同一台电脑的不同登录用户名,ClickOnce部署的程序是不能共用的,就是说,如果2个登录用户名在同一台电脑上用同一个ClickOnce部署的程序,必须各自安装1遍。我在用VS2005的时候用ClickOnce发布过系统(当然系统不是很庞大),不知道VS2008有何变化。

    2008年4月10日 9:34
    版主

全部回复

  • 第一个问题请参考 使用 ClickOnce 部署 API 按需下载程序集

    使用清单生成和编辑工具 - 图形客户端 (MageUI.exe) 在 ClickOnce 应用程序中将程序集标记为可选。

     

    Smile

    2008年4月10日 3:05
    版主
  • 那上面所说的是,某些功能在需要时去下载,不需要是不去下载。

    我现在要实现的是,某些没有更新的文件不要去下载。改变的去更新。

    2008年4月10日 8:09
  • ClickOnce只能满足大部分部署要求。如果需要特定的行为,只能靠ClickOnce提供的类进行自定义了。

    对于第二个问题,如果更新提示被skip掉了,你没法控制让它在下次启动的时候自动再提示一次(它在你的程序之外),但是可以手工编写代码在你的程序内部来实现。

    你可以利用System.Deployment.Application类(在System.Deployment.dll中),利用CheckForUpdateCheckForUpdateAsync方法检测服务器上是否有新版本,然后给用户提示,然后可以通过UpdateUpdateAsync 来安装更新。更多的功能,你可以查询MSDN上关于System.Deployment.Application的功能说明以及各种属性和方法列表:

    http://msdn2.microsoft.com/zh-cn/library/system.deployment.application.aspx

    对于第一个要求,貌似目前默认的支持无法实现,需要自己仔细规划和实现自己的更新逻辑。也就是说,第一次安装可以利用ClickOnce,随后的版本更新完全依靠自己实现这种只更新个别文件的机制。

    对于按需更新,我记得是对于同一个版本的文件,按照需要决定是否需要下载,而不是针对不同版本的。

    2008年4月10日 8:36
    版主
  • 第2个问题照你所说也实现不了。

    难道第一个问题没人遇到过? 后来都这么实现的啊?

    2008年4月10日 9:04
  • 可以通过在发布程序清单时指定使用的最低版本,这样用户登录发现新版本时就不会提示是否更新,而是直接更新。

     

     

    对于第一个问题,由于我们也准备使用ClickOnce,所以查了些资料,对于ClickOnce的按需下载并不能解决这个问题,在Msdn的文档中提到ClickOnce的更新策略使用了一种“文件修复”的技术:即如果你的dll没有编译过,他的清单中的hash值相同,ClickOnce在判断时会比较hash值,如果相同,就不会下载,这是官方的说明。

     

    但是我到现在也没有测试成功过,给微软的人发mail也还没有得到反馈,期待得到答复。

     

    ps:Msdn关于ClickOnce的文档太差了,还有关于发布路径、安装路径、更新路径什么的,搞的我乱七八糟,到现在也没清楚,期待明白人给个明确说明。

     

    2008年4月10日 9:15
  • 我记得通过ClickOnce发布的同一个程序的不同版本存放在不同的目录,因此楼主第一个要求,不完全自定义更新逻辑的话,应该是没办法实现的。

    楼主第二个问题,虽然不能让默认机制第二次显示更新提示,但是可以通过我说的那些类在你程序内部作出更新提示,这也算是一种比较简单的弥补措施吧。

    至于ClickOnce的发布路径、安装路径、更新路径,我记得发布路径就是网站或者IIS虚拟目录的位置就行了,安装路径你没法控制,在一个比较深的路径下,你在系统盘下搜索你的程序的exe文件名能搜到,好像在 系统盘:\Documents and Settings\系统登录名\Local Settings\Application Data\ClickOnce里设置的公司名称 下,应该是每个版本一个目录。

    更新路径好像就是在安装路径下,每个版本一个目录。

     

    另外还有一个“特点”,就是对于登录同一台电脑的不同登录用户名,ClickOnce部署的程序是不能共用的,就是说,如果2个登录用户名在同一台电脑上用同一个ClickOnce部署的程序,必须各自安装1遍。我在用VS2005的时候用ClickOnce发布过系统(当然系统不是很庞大),不知道VS2008有何变化。

    2008年4月10日 9:34
    版主
  • 呵呵 谢谢帮忙。。

    在我看来也可能实现不了,不过不敢说肯定实现不了 哎。。 就这样吧

    2008年4月10日 10:03