自動公升級系統的設計與實現(原始碼)

2022-03-01 22:18:14 字數 4326 閱讀 1543

(最新oaus版本請參見:自動公升級系統oaus的設計與實現(續)

)對於pc桌面應用程式而言,自動公升級功能往往是必不可少的。而自動公升級可以作為乙個獨立的c/s系統來開發,這樣,就可以在不同的桌面應用中進行復用。基於esframework

在上述的場景中,自動公升級時,我們能否只更新那個被修改了的1k的dll了?當然,使用oaus自動公升級系統可以輕鬆地做到這一點。oaus自動公升級系統可以對被分發的客戶端程式中的每個檔案進行版本管理,每次公升級的基礎單元不再是整個客戶端程式,而是其中的單個檔案。針對單個檔案的更新,包括三種形式:

(1)檔案被修改。

(2)檔案被刪除。

(3)新增加某個檔案。

oaus對這三種形式的檔案更新都是支援的。每次自動公升級,都可以更改n個檔案、刪除m個檔案、新增加l個檔案。

oaus提供了可直接執行的服務端程式和客戶端程式:autoupdatersystem.server.exe 和 autoupdater.exe。 oaus服務端的目錄結構如下所示:

oaus的客戶端與伺服器之間通過tcp通訊,可以在autoupdatersystem.server.exe.config配置檔案中配置伺服器通過哪個tcp埠提供自動公升級服務。

filefolder資料夾初始是空的,其用於部署被分發的程式的各個檔案的最新版本。注意,其下的檔案結構一定要與被分發的程式正常部署後的結構完全一致 -- 即相當於在filefolder資料夾下部署乙個被分發的程式。

oaus客戶端的目錄結構如下:      

可以在autoupdater.exe.config配置檔案中配置oaus伺服器的ip、埠等資訊,其內容如下所示:

<

configuration

>

<

>

<

add

key="serverip"

value

="127.0.0.1"

/>

<

add

key="serverport"

value

="4530"

/>

<

add

key="callbackexename"

value

="demo.exe"

/>

<

add

key="title"

value

="檔案更新"

/>

>

configuration

>

請注意配置的callbackexename,其表示當公升級完成之後,將被啟動的分發程式的exe的名稱。這個callbackexename配置的為什麼是名稱而不是路徑了?這是因為使用和部署oaus客戶端時是有要求的:

(1)被分發的程式的可執行檔案exe必須位於部署目錄的根目錄。

(2)oaus的客戶端(即整個autoupdater資料夾)也必須位於這個根目錄。

如此,autoupdater就知道分發程式的exe相對自己的路徑,如此就可以確定分發程式的exe的絕對路徑,所以就可以在公升級完成後啟動目標exe了。另外,根據上述的兩個約定,再結合前面講到的服務端的filefolder資料夾的結構約定,當服務端更新乙個檔案時,autoupdater便可以確定該檔案在客戶端機器上的絕對路徑了。

下面我們就詳細講講如何使用oaus來構建自動公升級系統,大概的步驟如下。

(1)執行oaus服務端。     

服務端主介面將顯示所有正在自動公升級的oaus客戶端資訊。

(2)將被分發的客戶端程式的所有內容放到oaus服務端的filefolder資料夾下,其結構與客戶端程式正常部署後的結構要完全一致。我們以部署videochatsystem為例。 

(3)使用oaus服務端為被分發的客戶端程式的每個檔案生成預設版本號,並建立版本資訊配置檔案updateconfiguration.xml。這個配置檔案也將被客戶端使用。

點選服務端【工具】選單欄下的【版本管理】子選單,將彈出用於管理各個檔案版本的【檔案版本資訊】窗體。         

雙擊列表中的任意一行,可以修改其對應檔案的版本的值(float型別的數值)。注意,此列表中的版本資訊與檔案的真實版本屬性(比如dll的版本屬性x.x.x.x)可以是沒有任何聯絡的,列表中版本的值只是用於標記檔案是否被修改,所以,檔案每被修改一次,其列表中對應的版本的值就應該有所增大。

當關閉【檔案版本資訊】窗體時,只要有某個檔案版本變化,則「最後綜合版本」的值(int型別)會遞增1。通過比較oaus的客戶端儲存的「最後綜合版本」的值與oaus的服務端最新的「最後綜合版本」的值,就可以快速地識別客戶端是否已經是最新版本了。

另外,初次開啟這個視窗時,將在oaus服務端的目錄下,自動生成乙個版本資訊配置檔案updateconfiguration.xml。而且,每當通過該窗體來設定某個檔案的新版本時,updateconfiguration.xml會自動同步更新。

(4)將updateconfiguration.xml新增到oaus的客戶端程式(即上述的autoupdater的資料夾)中。

(5)在建立被分發的客戶端的安裝程式時,將oaus的客戶端(即autoupdater的資料夾)也打包進去,並且像前面說的一樣,要將其直接部署在執行目錄(basedirectory)下(與分發的exe同一目錄)。

如此,準備工作就完成了,當客戶端通過安裝包安裝好了videochatsystem之後,其目錄結構像下面這樣: 

(6)當我們有新的版本要發布時,比如要更新某個檔案(因為檔案被修改),那麼可以這樣做:

a.將修改後的檔案拷貝到oaus服務端的filefolder資料夾下的正確位置(或覆蓋舊的檔案)。

b.在oaus服務端開啟【檔案版本資訊】窗體,雙擊被修改檔案所對應的row,在彈出的窗體上修改對應檔案的版本號,將版本號的數值增加。(如果是刪除舊檔案或新增新檔案,此處也可進行相應的操作)

(7)如此,當客戶端再啟動autoupdater.exe時,就會自動公升級,更新那些發生變化的檔案。 以下是autoupdater.exe執行起來後的截圖。

(8)當公升級完成後,將啟動前述的oaus客戶端配置檔案中配置的**exe。(在本例中就是videochatsystem.exe)

(9)oaus客戶端會在日誌檔案updatelog.txt(位於autoupdater的資料夾下,在oaus客戶端首次執行時自動生成該檔案)中,記錄每次自動公升級的情況。

我們的經驗是這樣的:客戶端登入成功之後,從伺服器獲取「最後綜合版本」的值,然後與本地的「最後綜合版本」的值相比較,如果本地的值較小,則表示客戶端需要更新。這個過程可以這樣做到:

(1)當在oaus服務端的filefolder資料夾下放置了新的檔案,並通過【檔案版本資訊】窗體正確的更新了版本號,在關閉【檔案版本資訊】窗體時,「最後綜合版本」的值會自動加1。

(2)系統客戶端可以通過呼叫autoupdater.versionhelper類的靜態方法hasnewversion()來判斷是否有新版本。

(3)如果hasnewversion方法返回true,則通常有兩種模式:由使用者選擇是否公升級,或者是強制公升級。

一般而言,如果最新客戶端程式與老版本相容,不公升級也影響不大,則可以交由使用者決定是否公升級;如果最新客戶端程式不相容老版本,或者是有重大更新,則將啟動強制公升級。如果流程要進入啟動公升級,那麼只要啟動autoupdater的資料夾下autoupdater.exe就可以了。要注意的是,啟動autoupdater.exe程序後,要退出當前的客戶端程序,否則,有些檔案會因為無法被覆蓋而導致更新失敗。**大致如下所示: 

if (versionhelper.hasnewversion(oausserverip,oausserverport)) 

1.自動公升級系統oaus - 原始碼

2.自動公升級系統oaus(可直接部署)

VB原始碼之友公升級了(系統核心的公升級最近也要推出)

2005年08月20日 21 24 00 以前有些懶,雖然用原始碼之友過程中出現了幾次 vb ide宕機 害的要關閉vb ide,如果沒儲存就慘了 不過一般免費使用者遇不到,那是在專業版中提供的僅對函式內整理的功能。目前已經修改完畢。此外,對不是使用標準系統主題的使用者 或win98 的使用者,在v...

VB原始碼之友公升級了(系統核心的公升級最近也要推出)

以前有些懶,雖然用原始碼之友過程中出現了幾次 vb ide宕機 害的要關閉vb ide,如果沒儲存就慘了 不過一般免費使用者遇不到,那是在專業版中提供的僅對函式內整理的功能。目前已經修改完畢。此外,對不是使用標準系統主題的使用者 或win98 的使用者,在vb ide圖示顯示效果很不好,因為它不是透...

自動裝箱與拆箱原始碼

裝箱就是自動將基本資料型別轉換為包裝器型別 拆箱就是自動將包裝器型別轉換為基本資料型別。總結裝箱和拆箱的實現過程 裝箱過程是通過呼叫包裝器的valueof方法實現的,而拆箱過程是通過呼叫包裝器的 value方法實現的。代表對應的基本資料型別 先貼一道題 public class test 輸出結果是...