【開源】檢查更新程序 CheckUpdate.Net 的實現


訪問最新源代碼及更新歷史:http://git.oschina.net/xcong/CheckUpdate.Net

DownLoad

更新歷史

version 1.2

  • [新增]添加UpdateFileClient.exe.config文件,修改UpdateFileClient.exe依賴的.Net Framwork 2.0版本與主程序兼容問題
  • [修改]修改更新程序,下載文件不存在時提示文件出錯。

version 1.1

  • 【修改】修改窗體文件丟失
  • 【新增】新增服務端配置項添加安裝包位置和版本
  • 【新增】新增UpdateCommon中VersionHelper下載安裝包方法GetNewVersionToDownloadSetup。如果需要下載,彈窗提醒,並調用瀏覽器下載,同時返回True。

介紹

CheckUpdate.Net是.Net C/S下一個檢查更新程序。現有的檢查更新方式多種多樣,更新程序也大不相同。有個比較出名的OSAU(參考了他的界面),但是有10個鏈接限制。微軟也有比較方便的ClickOnce。自己也嘗試了其他的,發現沒有合適的就決定自己寫一個。
考慮到復用,在.Net Framework2.0下開發。主要就是利用WebClient下載服務器網站目錄下的文件,安全性暫沒有考慮,比較適用於小型項目。

UpdateFileClient.exe/UpdateFile.xml/UpdateFileCommon.dll/UpdateFileClient.exe.config[可選] 為客戶端需要用到的文件

UpdateFileServer.exe/UpdateServer.xml/UpdateFileCommon.dll 為服務端需要用到的文件

注意事項:

1.UpdateFileClient.exe依賴於.Net Framwork 2.0,如果主程序的.Net Framwork版本高於2.0,需要添加UpdateFileClient.exe.config文件(默認是兼容4.0)。
如果主程序的.Net Framwork版本為2.0,請刪除UpdateFileClient.exe.config文件。

.Net Framwork 4.0是新的CLR,無法兼容舊版CLR。該方案主要兼容在Windows Xp下單獨安裝了.Net Framework 4.0 版本。
Windows Vista/Win7 已經分別安裝.Net Framework 2.0與3.5,具有CLR 2.0特性,需要刪除App.config。

主要功能

  • 支持單個或多個文件更新
    讀取服務端XML配置文件,獲取需要修改或新增的文件,然后進行下載,下載完成之后,更新本地版本。
  • 支持更新更新程序本身
    通過配置本地的XML文件,放置更新程序的目錄。主程序啟動時,進行檢查,處理。
  • 服務端支持程序更改配置文件,無需手動更改XML

使用方式

  • 配置服務端,需要能夠通過正常訪問XML和文件。一般采用新建一個web站點,發布到IIS的方式。

    將UpdateFileServer.exe/UpdateServer.xml/UpdateFileCommon.dll 拷貝到服務端,通過UpdateFileServer.exe配置XML。

  • 將主程序運行需要的文件通過XML配置起來

    將Update.xml、UpdateFileClient.exe、UpdateFileCommon.dll添加到啟動程序相同目錄,主程序需要引用UpdateFileCommon.dll。
    將啟動程序需要更新的文件通過XML進行配置,放在File節點下,初始版本為1。
    配置服務端XML所在路徑,當前版本、版本對應的值、臨時文件夾、更新程序名稱可以采用默認值。

  • 實現更新程序的更新

    需要在主程序中添加一行代碼,進行檢查臨時文件夾是否包含更新程序,如果有,進行剪切操作。

using UpdateFileCommon;
//發現新的更新程序,進行剪切到根目錄
VersionHelper.CutNewUpdateEXE();
  • 按需添加檢查更新代碼

    可以在程序啟動時或者點擊按鈕進行檢查更新操作。
    檢查更新是彈窗進行提醒,需要傳兩個參數,一個更新描述,一個是否強制更新。對應XML節點是服務端XML的ReleaseNote和IsMustUpdate。
    NextShowEvent 事件是點擊按鈕下次提醒需要執行的操作。

    Winform

    //默認的LoginView為登陸窗體
    ApplicationContext context = new ApplicationContext(new LoginView());
    //發現設定的目錄存在新的更新程序,進行剪切到根目錄
    VersionHelper.CutNewUpdateEXE();

    //檢查是否需要下載安裝包,不需要下載返回False
    if (!VersionHelper.GetNewVersionToDownloadSetup())
    {
        //檢查版本更新
        if (VersionHelper.IsRequiredUpdate())
        {
            string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + "UpdateFile.xml";
            if (File.Exists(xmlPath))
            {
                //加載XML路徑
                XmlDocument doc = new XmlDocument();
                doc.Load(VersionHelper.GetLoaclServerConfigURL(xmlPath));
                //獲取值
                var releaseNote = VersionHelper.GetServiceReleaseNote(doc);
                var isMustUpdate = VersionHelper.GetServiceIsMustUpdate(doc);
                PromptingForm form = new PromptingForm(releaseNote, isMustUpdate);
                //賦值委托,點擊下次提醒的按鈕執行的操作
                form.NextShowEvent += delegate
                {
                    //執行xxx
                };
                context = new ApplicationContext(form);
            }
        }
    }
    
    //do something
     Application.Run(context);

WPF

WPF中需要特殊處理,在WPF項目中添加Program.cs文件,添加Main方法,項目右鍵屬性,設置Program為啟動對象。

[STAThread]
static void Main()
{
    //發現設定的目錄存在新的更新程序,進行剪切到根目錄
    VersionHelper.CutNewUpdateEXE();

    //檢查是否需要下載安裝包,不需要下載返回False
    if (!VersionHelper.GetNewVersionToDownloadSetup())
    {
        //檢查版本更新
        if (VersionHelper.IsRequiredUpdate())
        {
            string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + "UpdateFile.xml";
            if (File.Exists(xmlPath))
            {
                //加載XML路徑
                XmlDocument doc = new XmlDocument();
                doc.Load(VersionHelper.GetLoaclServerConfigURL(xmlPath));
                //獲取值
                var releaseNote = VersionHelper.GetServiceReleaseNote(doc);
                var isMustUpdate = VersionHelper.GetServiceIsMustUpdate(doc);
                PromptingForm form = new PromptingForm(releaseNote, isMustUpdate);
                //賦值委托,點擊下次提醒的按鈕執行的操作
                form.NextShowEvent += delegate
                {
                    //執行xxx
                };
                //這里啟動PromptingForm窗體
                form.ShowDialog();
            }
        }
    }
    //不需要更新時,默認啟動登陸窗體
    else
    {
        LoginView view = new LoginView();
        view.ShowDialog();
    }
}

聯系我們

CheckUpdate.Net交流群 137867517 [點擊加群]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM