日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用GeneralUpdate实现.NET客户端程序自动更新

發布時間:2024/5/8 asp.net 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用GeneralUpdate实现.NET客户端程序自动更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET客戶端程序自動更新

當我們在日常開發中編寫的客戶端程序需要部署在多臺主機上時,如果程序需要升級,那么一臺臺升級會非常麻煩,此時就可以使用本文的.NET客戶端程序自動更新技術。

本文所述的自動更新技術主要使用了開源的GeneralUpdate組件,可用于Winform/WPF/ConsoleApp等應用程序的自動更新。

GeneralUpdate組件是微軟的一位MVP負責開發和維護的,Gitee地址為:GeneralUpdate。作者提供的使用文檔和視頻有些過于簡單,而且不同版本還存在一定的兼容性問題,這些都沒有很好地解釋,所以初次接觸這個組件的開發人員可能會有點懵。筆者結合自己在項目中實際的使用情況,更加詳細地介紹一下該組件的使用方式。

文章目錄

  • .NET客戶端程序自動更新
    • 自動更新流程圖
    • 代碼結構剖析
    • Winform應用程序的自動更新實戰
      • 更新組件的控制臺實現
      • 客戶端調用
    • 幾個槽點
    • 總結

自動更新流程圖

鑒于原圖的說明不夠明確,筆者在上圖中使用紅色字體新增了說明。上圖中看上去是3個組件或服務的交互,但準確說是4個:

  • 客戶端程序版本校驗服務(非必須):該服務至少提供兩個API,一個是用于判斷客戶端程序有沒有最新版本,另一個是獲取當前客戶端的所有更新版本。有些時候我們并不想單獨編寫并部署一個校驗服務,那么我們就可以直接用數據庫來替代。客戶端程序直接查詢數據庫,判斷并獲取當前程序的所有更新版本。
  • 客戶端程序(必須):需要具有自動更新功能的業務程序,可以通過反射獲取自身程序集的版本號,并和服務端/數據庫比對,判斷是否有新版本。
  • 更新組件(必須):更新組件實際上是一個單獨的可執行文件,放在和客戶端程序的同級目錄下。該組件的主要作用是從指定路徑下下載客戶端程序的所有更新壓縮包,并逐個解壓,實現客戶端程序的逐版本升級。當客戶端從服務端獲取到待更新文件的路徑時,需要通過進程間通信啟動更新組件,更新組件啟動后需要關閉客戶端程序以防止某些文件被占用導致更新失敗。更新組件更新成功后重新啟動客戶端,并關閉組件自身,完成自動更新。
  • 文件服務器(必須):客戶端程序的更新壓縮包上傳到文件服務器后得到每個壓縮包的URL,更新組件根據該URL下載程序。筆者用的文件服務器是HFS,下載地址為:HFS下載。
  • 代碼結構剖析

    上圖中以GeneralUpdate開頭的工程是自動更新功能的核心代碼,在nuget服務器上能看到各個工程的包。具體使用哪個包取決于你是想實現更新組件自更新還是更新客戶端程序還是編寫版本校驗服務,可參考框架README.md中的介紹。

    這里要說明的是,上述組件不是向下兼容的!3.x.x版本的組件的很多方法都進行了更名,因此不能直接從2.x.x版本直接升級。

    上圖中以AutoUpdate開頭的工程是對自動更新流程圖中3個主要組件的簡單實現:

    • ConsoleApp:更新組件的控制臺版本DEMO(需要和文件服務器配合使用,引入了GeneralUpdate.Core)
    • MauiApp-Sample:未仔細研究,不清楚
    • MinimalService:客戶端版本校驗服務DEMO(引入了GeneralUpdate.AspNetCore)
    • Test:更新組件自更新的WPF版本DEMO(需要和MinimalService配合使用,引入了GeneralUpdate.ClientCore)
    • WpfApp:GeneralUpdate.Single包的使用DEMO,用于構建單例版本的更新組件(引入了GeneralUpdate.Single)
    • WpfNet6-Sample:更新更新組件的WPF版本程序。

    Winform應用程序的自動更新實戰

    從上節的描述可知,如果我們不想編寫客戶端版本校驗服務,只想通過文件服務器來更新客戶端程序,那么我們只需要一個控制臺版本的更新組件即可,所以可參考ConsoleApp工程下的代碼。

    更新組件的控制臺實現

    說明:本示例使用的是GeneralUpdate.Core的2.1.6版本。因為Github上的源碼已升級到3.x.x版本,支持了.NET 6.0,但筆者電腦上的缺乏相關框架,無法編譯通過,所以檢出到了源碼的某次提交,這樣即使使用的時候出了問題也可以通過調試源碼的方式來解決。如果大家充分理解了本文的意思,直接安裝最新版本的nuget包也可以,直接參考最新版源碼的相關示例。

    using System; using System.ComponentModel; using System.Diagnostics; using GeneralUpdate.Core; using GeneralUpdate.Core.Strategys; using GeneralUpdate.Core.Update; using ProgressChangedEventArgs = GeneralUpdate.Core.Update.ProgressChangedEventArgs;namespace AutoUpdate.ConsoleApp {class Program{static void Main(string[] args){// args = new []{// "1.0.1",// "1.0.2",// "",// "http://127.0.0.1:7000/client_v1.0.2.zip",// @"D:\Project",// "36aad55a19f85ee6e1fbdc26510a26c1"// };KillProcess("你的客戶端程序名,不用加exe");GeneralUpdateBootstrap bootstrap = new GeneralUpdateBootstrap();bootstrap.DownloadStatistics += OnDownloadStatistics;bootstrap.ProgressChanged += OnProgressChanged;bootstrap.Strategy<DefultStrategy>().Option(UpdateOption.Format, "zip").Option(UpdateOption.MainApp, "你的客戶端程序名,不用加exe").Option(UpdateOption.DownloadTimeOut, 60).RemoteAddress(args).Launch();Console.ReadKey();}private static void OnProgressChanged(object sender, ProgressChangedEventArgs e){if (e.Type == ProgressType.Updatefile){var str = $"當前更新第:{e.ProgressValue}個,更新文件總數:{e.TotalSize}";Console.WriteLine(str);}if (e.Type == ProgressType.Done){Console.WriteLine("更新完成");}if (e.Type == ProgressType.Fail){Console.WriteLine(e.Message);}}private static void OnDownloadStatistics(object sender, DownloadStatisticsEventArgs e){Console.WriteLine($"下載速度:{e.Speed},剩余時間:{e.Remaining.Minute}:{e.Remaining.Second}");}private static void KillProcess(string processName){foreach (var process in Process.GetProcesses()){if (!process.ProcessName.ToUpper().Contains(processName.ToUpper())) continue;try{process.Kill();process.WaitForExit();}catch (Win32Exception){}}}} }

    客戶端調用

    Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; var ver = $"{version.Major}.{version.Minor}.{version.Build}"; //從數據庫獲取比當前程序集版本更高的版本信息 var versionInfo = TOSBll.Instance.GetLastUpdateVersionInfo(1, ver); if (versionInfo != null) {string para =$"{ver} {versionInfo.VERSION} \"\" {versionInfo.URL} {Environment.CurrentDirectory} {versionInfo.MD5}";ExecuteAsAdmin("AutoUpdate.ConsoleApp.exe", para);return; }private static void ExecuteAsAdmin(string fileName, string args) {Process proc = new Process();proc.StartInfo.FileName = fileName;proc.StartInfo.UseShellExecute = true;proc.StartInfo.Verb = "runas";proc.StartInfo.Arguments = args;proc.Start(); }

    由上述代碼可知,客戶端使用進程間通信的方式來啟動更新組件,并傳入更新參數信息。這里通過管理員權限啟動更新組件,以免更新失敗(組件在更新時需要把文件拷貝到系統的臨時目錄,更新成功后刪除,權限不足時會出錯)。不過筆者測試中發現這種方式啟動仍然失敗,還是通過右鍵AutoUpdate.ConsoleApp.exe程序并附加管理員權限才成功的。

    幾個槽點

  • 關鍵版本不打標簽,使用者想切換到nuget包的2.1.6版本都不知道該檢出到哪次提交。
  • 新版本組件不兼容老版本。
  • 單元測試文件中使用的代碼是老版本的,組件源碼卻是新版本的,直接把剛接觸該組件的人員給弄懵圈了。
  • 目前還存在一些小bug,比如FileUtil.Update32Or64Libs()就會拋出異常,因為把一個目錄刪除了兩遍,從而導致第一次啟動更新的時候更新失敗,但是第二次更新的時候卻能成功,因為目前已經刪了。筆者已提Issue,不知作者何時能解決。
  • 文檔過于簡單。
  • 總結

    雖然GeneralUpdate組件有一些不足,但相信經過本文的介紹,大家已經知道如何避坑來使用該組件。總體來說,該組件的功能還是蠻好用的。考慮到該組件只有作者一個人維護,其實已經做得蠻好了,還是要感謝作者的付出的。

    總結

    以上是生活随笔為你收集整理的使用GeneralUpdate实现.NET客户端程序自动更新的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲天堂av免费在线观看 | 欧美极品在线播放 | 久久免费看 | 一级做a爱片久久 | 久久久wwww | 成人短视频在线免费观看 | 亚洲色图视频在线观看 | 成人理论视频 | 美女丝袜av | 欧美一区二区三区在线观看视频 | 午夜精品久久久久久久99老熟妇 | 在线播放精品视频 | 午夜一区二区三区在线观看 | 久久男人| 亚欧美一区二区三区 | 色婷婷视频在线 | 91狠狠 | 九九色综合网 | 国产精品乱码久久久久 | 日韩第1页 | 中文字幕一区二区在线观看 | 中文字幕一区二区三区又粗 | 香港黄色网 | 91不卡在线 | 欧美一区,二区 | 性欧美一级| 成人h动漫精品一区二区 | 麻豆69xxnxxporn| 偷拍一区二区 | 人人射 | 亚洲人体一区 | 91看大片| 性生交大片免费看视频 | 高潮av在线 | 婷婷的五月 | 天天躁日日躁狠狠躁伊人 | 天天操夜夜草 | 亚洲欧美在线综合 | 一级激情视频 | 91视频分类| 玖玖爱精品 | 久久资源365 | 男人久久天堂 | 希岛婚前侵犯中文字幕在线 | 成人91网站 | 夜间福利在线观看 | 国产高清小视频 | 97操| 日韩综合一区二区 | 国产人成免费视频 | 中文字幕精品一区二区精 | 假日游船 | 日韩成人免费观看 | 人人草在线观看 | 欧美视频一区二区在线 | 欧美激情国产在线 | 西西大胆午夜视频 | 香蕉蜜桃视频 | 好吊视频一区 | 有码一区 | 东北熟女一区二区三区 | 玉女心经 在线 | 五月天婷婷导航 | 精品视频91 | 四虎永久在线精品免费网址 | 永久免费在线 | 天天操天天干天天插 | 在线国产中文字幕 | 久久久久久久久久久97 | 香蕉手机网| 中国成熟妇女毛茸茸 | 99免费在线观看 | 日韩成人av一区 | 麻豆av一区二区三区 | 日韩影视一区 | 蜜臀久久99精品久久久画质超高清 | 国产成人tv| 禁漫天堂黄漫画无遮挡观看 | 久久影院午夜理论片无码 | av毛片基地 | 奇米第四色首页 | 国产极品福利 | 日韩aaa | 最近2019中文字幕大全第二页 | 写真福利片hd在线播放 | 亚洲欧美精品一区二区三区 | 国产探花一区 | 欧美三级a做爰在线观看 | 天天做夜夜爱 | 久久婷婷亚洲 | 日韩欧美国产高清91 | 美女露胸无遮挡 | 毛片a| 美女网站在线免费观看 | 乳色吐息免费看 | 老司机成人免费视频 | 福利姬在线观看 | 牛av| 国产一区二区在线免费观看 |