[VB2010]如何做到線上檢查更新功能?

一個程式通常都需要定期維護,以修正先前的錯誤或增加新功能。然而當一個程式設計者完成該程式的新版本後,要如何通知使用者進行更新,這就成了一個很大的問題了。檢查更新最簡單的作法就是在程式內設計一個連到網路上取得最新版本號碼的功能,接著再與使用者目前使用的程式版本號碼做比對,如果不相同,則代表有新版本。

以下是我寫好的「CheckNew」類別(看得懂的人可以依用途自行修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Public Class CheckNew '檢查更新
    '字串常數
    Private Const DefaultInfoCode As String = "UTF-8" '儲存預設編碼為「UTF-8」
    Private Const DefaultInfoFeature As String = "電腦不難" '儲存預設更新版本資訊的特徵為「電腦不難」
    Private Const DefaultInfoSeparator As String = "|" '儲存預設更新版本資訊的分隔字元符號為「|」
    Private Const DefaultNotCheckReturn As String = "Not yet." '儲存還沒檢查更新時所傳回的字串訊息
    Private Const DefaultCheckErrorReturn As String = "Error." '儲存檢查更新失敗時所傳回的字串訊息
 
 
    '更新資訊組態
    Private sInfoURL As String '儲存更新版本資訊的網址
    Private sInfoCode As String = DefaultInfoCode '編碼
    Private sInfoFeature As String = DefaultInfoFeature '儲存更新版本資訊的特徵,預設為「電腦不難」
 
    '檢查結果
    Private shInfoConsequence As Short = -1 '0為沒有新版本;1為有新版本;2為檢查更新失敗;-1為尚未檢查
    Private sInfoNumber As String '儲存取得的版本號碼
 
    Public Sub New(ByVal SetInfoURL As String) 'CheckNew建構子(多載1)。引數為SetInfoURL,載入更新版本資訊的網址。
        sInfoURL = SetInfoURL '設定更新版本資訊的網址
    End Sub
 
    Public Sub New(ByVal SetInfoURL As String, ByVal SetInfoFeature As String) 'CheckNew建構子(多載2)。引數為SetInfoURL和SetInfoFeature,載入更新版本資訊的網址和判斷特徵。
        sInfoURL = SetInfoURL '設定更新版本資訊的網址
        sInfoFeature = SetInfoFeature '設定更新版本資訊的特徵
    End Sub
 
    Public WriteOnly Property SetInfoCode() As String '設定更新版本資訊的編碼
        Set(ByVal Code As String)
            sInfoCode = Code
        End Set
    End Property
 
    Public WriteOnly Property SetInfoURL() As String '設定網址
        Set(ByVal URL As String)
            sInfoURL = URL
        End Set
    End Property
 
    Public WriteOnly Property SetInfoFeature() As String '設定特徵
        Set(ByVal Feature As String)
            sInfoFeature = Feature
        End Set
    End Property
 
    Public ReadOnly Property GetMyVersion() As String '取得程式的版本號碼(格式:X.X.X)
        Get
            Return My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build '取得版本號碼
        End Get
    End Property
 
    Public ReadOnly Property GetCheckConsequence() As String '取得檢查更新的結果
        Get
            Return shInfoConsequence
        End Get
    End Property
 
    Public ReadOnly Property GetCheckConsequenceNumber() As String '取得最新版本號碼
        Get
            If shInfoConsequence = -1 Then '如果還沒檢查
                Return DefaultNotCheckReturn
            ElseIf shInfoConsequence = 2 Then '如果檢查失敗
                Return DefaultCheckErrorReturn
            Else '如果檢查成功
                Return sInfoNumber
            End If
        End Get
    End Property
 
    Public Sub CheckNew() '檢查更新
        On Error Resume Next
        Dim CheckNewClient As New Net.WebClient() '宣告CheckNewClient為WebClient物件
        Dim Encode As System.Text.Encoding = System.Text.Encoding.GetEncoding(sInfoCode) '設定編碼
        Dim Info As IO.StreamReader = New IO.StreamReader(CheckNewClient.OpenRead(sInfoURL), Encode) '取得更新資訊
        Dim sInfoData As String = Info.ReadLine '儲存更新資訊
 
        Debug.Print("InfoData = """ & sInfoData & """") '(除錯用)顯示出從網路上下載的字串
 
        If Strings.InStr(1, sInfoData, sInfoFeature) > 0 Then '若能找到識別關鍵字(InfoFeature),則更新資訊取得成功
            Dim InfoArr() As String = Split(sInfoData, DefaultInfoSeparator) '分解字串為版本號碼(0)和識別關鍵字(1)
            sInfoNumber = InfoArr(0) '儲存最新版本號碼
            If InfoArr(0) <> GetMyVersion() Then '比對版本號碼,若不相同,代表有新版本
                shInfoConsequence = 1
            Else '若版本號碼相同,則代表沒有新版本
                shInfoConsequence = 0
            End If
        Else '若未能找到識別關鍵字(專案名稱),則更新資訊取得失敗
            shInfoConsequence = 2
        End If
    End Sub
End Class

CheckNew類別使用方法

在專案內加入CheckNew類別

使用CheckNew類別之前,需先將它加入到專案內。我會比較習慣另外新增一個模組(Module)來放自己寫的Public Class,所以先加入模組吧!

取好新模組的名稱後按下「新增」。

編輯剛才加入的模組程式碼。

貼上文章上面提供的一大串CheckNew類別程式碼。

上傳程式版本資訊的文字檔案

首先開啟記事本,依照下面各式將程式版本資訊填入:

主版本號(Major).副版本號(Minor).建立號(Build)|特徵字串

版本號的格式其實就是「X.X.X」(X為任意自然數),例如「12.0.742」。中間的「|」符號用來區隔版本號和特徵字串。而特徵字串的用途是拿來判斷VB連到網路上取得的檔案版本資訊是否正確,是否確實有讀取到檔案。若無法搜尋到特徵字串,則會傳回更新錯誤的訊息。

若特徵字串有用到全形字元(如中文字),則須將文字檔案儲存為UTF-8格式。

文字都輸入完成後,將它儲存為純文字檔案(例如txt檔),然後上傳到可以直連的網路空間(建議使用網址固定的空間,將來更新文字檔案才不用換網址。例如DropBox)。

新增CheckNew類別的物件(Object)

CheckNew物件跟一般物件的宣告方式一樣,但要注意的是CheckNew類別擁有兩個多載建構式,可以預先設定載入更新版本資訊的網址和判斷特徵。

宣告方式如下:

Dim 物件名稱 As New CheckNew(“程式版本資訊的文字檔案網址"[, “特徵字串"])

註:特徵字串為選擇項,若未設定則預設為"電腦不難"。

例如:

1
Dim CKNew As New CheckNew("http://dl.dropbox.com/u/11347597/checknew.txt", "CheckNew") '建立CheckNew類別的CKNew物件

檢查更新的方法(Method)

建立完CheckNew類別的物件後,並不會立刻連上網路檢查更新,還需要使用CheckNew()方法才可以進行更新。

使用方式如下:

物件名稱.CheckNew()

例如:

CKNew.CheckNew() '開始檢查更新

取得目前程式的版本號碼

CheckNew提供GetMyVersion()方法,能直接傳回目前程式的版本號碼,格式為X.X.X。

取得檢查更新結果

執行完CheckNew()方法後,可再利用GetCheckConsequence屬性來取得檢查更新的結果。如果傳回0,表示沒有新版本;傳回1,表示有新版本;傳回2,表示檢查更新失敗;傳回-1,表示尚未檢查更新。也可以利用GetCheckConsequenceNumber屬性來取得檢查出來的更新版本號碼,通常GetCheckConsequence和GetCheckConsequenceNumber會使用在一起。

為了方便判斷GetCheckConsequence的傳回值,我會比較建議使用Select Case來進行選擇判斷,例如:

1
2
3
4
5
6
7
8
Select Case CKNew.GetCheckConsequence '取得更新結果
	Case 0 '沒有更新
		MsgBox("恭喜,您目前的版本是最新的!", MsgBoxStyle.Information)
	Case 1 '有更新
		MsgBox("有新版本!" & vbCrLf & "目前版本號碼:" & CKNew.GetMyVersion & vbCrLf & "最新版本號碼:" & CKNew.GetCheckConsequenceNumber, MsgBoxStyle.Information)
	Case 2 '更新失敗
		MsgBox("更新失敗!", MsgBoxStyle.Critical)
End Select

撰寫程式碼

了解CheckNew物件的用法之後,就可以開始寫程式碼了!首先開啟一個表單,在想要的地方加入檢查更新的功能。在此我新增一個檢查更新的按鈕(Button)為例。

連續用滑鼠左鍵點兩下Button,自動產生Click事件的程式碼,將CheckNew物件的程式寫進去。

執行結果如下:

沒有新版本

有新版本

檢查更新失敗

如何修改程式的版本號碼?

開啟專案屬性。

在「應用程式」標籤頁中,按下「組件資訊」按鈕。

「組件版本」項目就是CheckNew拿來判斷的版本號碼。

更改組件版本後的執行結果如下:

文章分類:VB.net|標籤:, ,

迴響已關閉