【问题标题】:Automatic Update Framework/Engine自动更新框架/引擎
【发布时间】:2014-10-30 06:58:03
【问题描述】:

我正在开发一个应该能够自动更新的客户端应用程序(.NET)。 该应用程序将使用 Simple WiX/MSI 安装程序进行部署。

我需要的是:

  • 检查服务器的文件版本/哈希/日期
  • 下载较新的文件
  • 更新文件并重新启动应用程序。

是否有任何合适的框架/模式来存档?

我发现/尝试了以下内容:

  • ClickOnce(不适合我们的需求,因为它无法在第一学期安装应用程序机器)
  • wyUpdate 似乎已停止
  • ClickThrought 似乎已停止使用
  • Google 奥马哈对于我试图实现的目标来说看起来有点复杂。

是否有任何积极开发和可靠的解决方案(它们不需要免费也不需要开源)?

【问题讨论】:

  • 您可能找不到非常可靠的东西,部分原因是您自己动手并不难。本质上,您需要做的就是在某处发布版本的 RSS 提要并定期检查新条目。 Wix 甚至包含该功能作为示例。
  • 我已经预料到了这样的事情,尽管我仍然更喜欢现有的解决方案,因为我认为这是一项非常常见的任务。您可以链接 WiX 示例吗?
  • 为什么说点击已停止?即使是这样,这也是一个很好的起点,尤其是在 Wix 环境中:github.com/wixtoolset/wix4/tree/develop/src/tools/ct
  • @SimonMourier 我发现的关于 ClickThrough 的每个链接都已死,而且我在 Google 没有找到任何东西,所以我认为该项目已停止。我去看看,谢谢

标签: .net deployment auto-update


【解决方案1】:

也许以下内容会有所帮助:

https://autoupdaterdotnet.codeplex.com/

或者你可以试一试:

https://github.com/synhershko/NAppUpdate

至少这两个看起来很活跃且易于使用。

【讨论】:

  • 两者似乎都不是很可靠。我已经遇到过 autoupdateerdotnet,但下载和日期并不能说服我。虽然我会看看 NAppUpdate
【解决方案2】:

我认为您可以自己编写代码。就像下面的代码:
对于您的Form,请使用以下代码:

Imports System.Net

Public Class frmMain
    Private WithEvents WebC As New WebClient
    Private updatefilename As String
    Private WithEvents updateTimer As New Timer With {.Enabled = True, .Interval = 300000} '300000 is 5 min

    Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        CheckUpdatePHP()   ' you can use the php method or the normal method
    End Sub

    Private Sub CheckUpdatePHP() Handles updateTimer.Tick 
        Dim ServerVer As String = WebC.DownloadString("http://yourdomainname.com/update.php?get=ver")
        If Not Application.ProductVersion.Equals(ServerVer) Then
            Dim updateURL As String = WebC.DownloadString("http://yourdomainname.com/update.php?get=url")
            updatefilename = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".exe"
            WebC.DownloadFileAsync(New Uri(updateURL), updatefilename)
        End If
    End Sub

    Private Sub CheckUpdate() 'Handles updateTimer.Tick
        Dim ServerInfo As String = WebC.DownloadString("http://yourdomainname.com/version.txt")
        Dim Infos As String() = ServerInfo.Split("%split%")
        If Not Application.ProductVersion.Equals(Infos(0)) Then
            Dim updateURL As String = WebC.DownloadString(Infos(1))
            updatefilename = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".exe"
            WebC.DownloadFileAsync(New Uri(updateURL), updatefilename)
        End If
    End Sub

    Private Sub WebC_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles WebC.DownloadFileCompleted
        Dim pinfo As New ProcessStartInfo(updatefilename)
        pinfo.WindowStyle = ProcessWindowStyle.Hidden
        pinfo.CreateNoWindow = True
        Process.Start(pinfo)
        End
    End Sub
End Class

version.txt 应该如下所示:

1.0.0.0%split%http://yourdomainname.com/update.exe

upload.php如果你会使用php方法,应该使用这个代码:

<?php
    if(isset($_GET['get'])){
        $get = $_GET['get'];
        $txt = file_GET_contents("version.txt");
        $info = explode("%split%",$txt);
        if($get = 'ver'){
            echo $info[0];
        }elseif($get = 'url'){
            echo $info[1];
        }
    }
?>

如果您将使用PHP method,您应该适当地将其从您的表单代码中删除,同样对于正常方法,您可以将version.txt 文件和update.exe 上传到您的保管箱帐户并使用它们。
随意问。

【讨论】:

  • 谢谢你,我知道更新本身是一项基本任务,但我认为在细节(安全/错误处理/身份验证)方面存在很多缺陷。
  • 你可以通过简单的编码来添加这些功能。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多