半ClickOnce自动更新

时间:2010-10-29 08:55:16

标签: clickonce

我希望无痛地部署应用程序,并启用自动更新。但是,我被迫使用MSI安装程序用于各种目的。我们将部署Windows窗体应用程序和一组Windows服务。

我真的很喜欢您可以点击发布标签中的几个按钮,并将其全部部署到包含.application.manifest文件的网络服务器。所以,我现在可以发布更改,但无法自动提取更改。我正在尝试自己编写一个autodownloader。

  1. 比较.application个文件(本地和远程),< assemblyIdentity name =“ClickOnceAppTest.application”version =“1.0.0.5”...如果本地版本不低于远程版本,则为版本值STOP。
  2. 读取< dependentAssembly dependencyType =“install”codebase =“Application Files \ ClickOnceAppTest_1_0_0_5 \ ClickOnceAppTest.exe.manifest”...以获取清单文件的路径。
  3. 对于每个标记,例如< dependency> < dependentAssembly dependencyType =“install”allowDelayedBinding =“true”codebase =“ClickOnceAppTest.exe”size =“26112”> < assemblyIdentity name =“ClickOnceAppTest”version =“1.0.0.1”...在清单文件中,比较哈希标记下的哈希码(< dsig:DigestValue> V1FBG6P353V5CT4JofOCwe0opeA =< / dsig:DigestValue>)
  4. 如果哈希值不同,请下载将.deploy扩展名剥离到临时路径的相应文件
  5. 现在,对于Windows Forms,我可以编写一些AppStarter,它将启动主应用程序并关闭检测到的更新的主应用程序,覆盖下载的所有EXE文件和DLL文件,然后重新启动应用程序。

    对于Windows服务,我想等到主循环结束(由计时器触发循环),然后停止计时器并应用更新。怎么样?

    这个非常通用的算法必须有陷阱(我的直觉告诉我),我不知道,因此我发布了这个问题。什么可能出错,何时? 您是否认为XML结构会随着时间的推移而保持不变(至少是对现有标签的预测)?

    我也downloadeded the .NET Application Updater。只是我必须自己构建XML文件,并且不确定它是否允许使用Windows服务。

1 个答案:

答案 0 :(得分:0)

我想,我遇到了类似的问题。我部署了一个带有两个Windows屏幕的Windows服务。一个屏幕控制Windows服务启动/停止和安装/卸载。使用ClickOnce进行部署还有一个。

我在部署项目中添加了Windows服务和配置屏幕作为内容文件。当客户端部署ClickOnce项目时,所有这些文件都将部署在计算机上。由于ClickOnce无法部署Windows服务,因此用户需要通过将Windows服务复制到默认文件夹来调用配置屏幕并安装/启动Windows服务。

将Windows服务复制到另一个文件夹是必要的,因为Clickonce会更改每个版本的文件夹。稍后将安排部署的应用程序以检查更新。当最新版本可用时,它将提示Windows服务停止并自行更新并再次启动Windows服务。