2014-09-05 45 views
10

我正在開發一個應該能夠自動更新自己的客戶端應用程序(.NET)。 應用程序將使用簡單的WiX/MSI安裝程序進行部署。自動更新框架/引擎

我需要的是:

  • 的文件版本/散列檢查服務器/日期
  • 下載更新文件
  • 更新文件&重新推出應用程序。

是否有任何合適的框架/模式來存檔?

我發現/試過如下:

  • 的ClickOnce(不適合我們的需要,因爲它是不能夠廣泛安裝應用程序的機器中的第一項)
  • wyUpdate似乎停止
  • ClickThrought似乎已停產
  • 谷歌奧馬哈看起來很複雜,我試圖達到目的。

是否有任何積極的開發和可靠的解決方案(他們不需要是免費的,也不需要OpenSource)?

+0

你可能不會找到非常可靠的東西,部分原因是因爲它不是很難推出自己的東西。實質上,您需要做的是發佈某個版本的RSS源,並定期檢查新條目。 Wix甚至包括作爲示例的功能。 – 2014-09-08 07:20:41

+0

我已經期待這樣的事情,雖然我仍然更喜歡現有的解決方案,因爲這是我認爲的一個非常常見的任務。你能鏈接WiX例子嗎? – Console 2014-09-08 07:27:27

+0

你爲什麼說點擊通過停止?即使是這樣,這是一個很好的起點,尤其是在Wix環境中:https://github.com/wixtoolset/wix4/tree/develop/src/tools/ct – 2014-09-09 05:58:44

回答

0

我認爲你可以自己編碼。就像下面的代碼:
爲了您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 you shoul d可以從表格代碼中刪除它,也可以使用常規方法將version.txt文件和update.exe上傳到您的保管箱帳戶並使用它們。
隨意問。

+0

謝謝你,我知道更新本身是一項基本任務,但我認爲在細節(安全/錯誤處理/認證)方面存在很多缺陷。 – Console 2014-09-15 08:03:09

+0

您可以通過簡單編碼添加這些功能。 – user3980820 2014-09-15 11:34:15