1. 程式人生 > >Excel催化劑開源第6波-Clickonce部署之自動升級瘦身之術

Excel催化劑開源第6波-Clickonce部署之自動升級瘦身之術

Clickonce無痛自動更新是我最喜歡使用VSTO開發並Clickonce部署的特性之一,但這個自動更新,通常會更新整個程式檔案,包含所有的引用dll和一些資原始檔等。

一般來說,我們更新的都是主程式,那些引用dll和資原始檔,除非是釋出時的版本的確更新了,才有必要更新到使用者的機器上,不然動不動所有檔案都一起更新,更新需要下載的檔案數量也太大,等待時間也太長,最終反而變得使用者體驗不夠完美。

資原始檔的問題還比較好解決,只要不把資原始檔內嵌到程式集中,然後通過手動下載或程式程式碼自動檢測有新增或更新就下載到使用者機器上(Excel催化劑原來是採用程式碼在程式執行時比較再自動化下載,無奈部署的是外網伺服器,下載速度有限,使用者反饋不友好,最後改為手動下載)。

引用的dll檔案,這個就比較難搞,經過網友師傅熱心指點後,最終也實現了,此篇著重分享的也是引用dll與主程式分離,實現Clickonce自動更新時不重複下載這些未改變的dll檔案。

  手動更新的檔案大小達30多M   Excel催化劑單獨更新的檔案,不用Clickonce更新

可以看到引用了好多大部頭的dll和資原始檔,例如讓Excel讀寫更快速的NPOI和EPPLUS庫、PowerBI訪問的分析服務類庫等。

 
引用dll檔案和配置檔案都不作更新

引用dll並非所有都可以分離,只有強型別簽名過的dll才可以分離到其他資料夾裡,不放到程式資料夾裡,具體原理需要自行百度瞭解

這個非強型別的dll不能分離,只能複製到本地為True

  強型別為false時示例

強型別為true時,在屬性這裡將複製本地改為false,釋出時就不會複製到程式資料夾

  強型別為true時的示例

可以來看最終的release資料夾中的檔案

  已經分離了大部分引用dll的效果

程式碼實現

在介面上作了個按鈕給使用者點選來更新

        private void btnUpdateSetting_Click(object sender, RibbonControlEventArgs e) { try { var result = MessageBox.Show(text: "更新過程較慢,需要耐心等待下,可能要好幾分鐘,期間不要操作Excel。\n選擇【是】繼續,選擇【否】退出。", caption: "更新配置檔案", buttons: MessageBoxButtons.YesNo, icon: MessageBoxIcon.Question); if (result == DialogResult.Yes) { Common.AppInteractiveSetting(false); AddinSettingUpdate.CheckWebConnectAndUpdateSettingFiles(); MessageBox.Show("更新完成,可能部分功能(自定義函式)需關閉所有Excel檔案重新開啟才能使用"); } } catch (Exception ex) { Common.OutMsgError(ex); } finally { Common.AppInteractiveSetting(true); } } 

簡單檢查下網路是否可通,再進行下載。

        public static void CheckWebConnectAndUpdateSettingFiles() { if (Common.CheckIsConnectInternet("http://101.132.130.88/test.html")) { string settingDir = Common.AddinsSettingDir; DownLoadResourceFile(settingDir); UDFLoad.LoadUDF(settingDir); } else { throw new Exception("網路未能連線\n此功能需要網路能訪問Excel催化劑伺服器網站\n伺服器IP為101.132.130.88,請檢查網路或諮詢IT部同事。"); } } 

筆者使用的是WebService的方式訪問伺服器的檔案,和本地檔案作比對,伺服器新的話,下載到本地。

 public static void DownLoadResourceFile(string settingDir)
        {

            string wsRootDir = @"F:\網站內容\VSTO外掛\Excel催化劑附加內容\";
            ServiceFileAnyc.FileAnycSoapClient client = new ServiceFileAnyc.FileAnycSoapClient();
            var srcFiles = client.GetFiles(wsRootDir);

            foreach (var srcFile in srcFiles)
            {
                var dstFilePath = Path.Combine(Common.AddinsSettingDir, srcFile.Replace(wsRootDir, ""));

                string dstDir = Path.GetDirectoryName(dstFilePath);
                if (!Directory.Exists(dstDir))
                {
                    Directory.CreateDirectory(dstDir);
                }

                DateTime srcFileLastWriteTime = client.GetLastWriteTimeOfFile(srcFile);
                DateTime dstFileLastWriteTime = DateTime.MinValue;

                if (Path.GetDirectoryName(dstFilePath).EndsWith("xml"))//當為xml時,只需要不存在時才覆蓋讀寫 { if (!File.Exists(dstFilePath)) { File.WriteAllBytes(dstFilePath, client.GetBytesOfFile(srcFile)); } } else { if (File.Exists(dstFilePath)) { dstFileLastWriteTime = File.GetLastWriteTime(dstFilePath); } if (dstFileLastWriteTime < srcFileLastWriteTime) { //xll資料夾裡的檔案不用同步,由另外的LOADUDF方法來同步 if (!Path.GetDirectoryName(dstFilePath).EndsWith("xll")) { File.WriteAllBytes(dstFilePath, client.GetBytesOfFile(srcFile)); File.SetLastWriteTime(dstFilePath, srcFileLastWriteTime); } } } } } 

讓引用dll可以分離的關鍵程式碼,在程式開始時訂閱一下這個事件,大概意思是程式要使用某個功能時,找不到相應的引用dll,會激發這個事件,在這個事件裡告訴程式應該下一步怎麼辦,繼續找的話從哪裡找就在這個事件方法中寫上。

方法中第1個dll文字是我的資料夾,assemblyName 是不含檔案字尾,所以要補上後面的是“.dll”

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

        private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name != null) { string assemblyName = new AssemblyName(args.Name).Name; return System.Reflection.Assembly.LoadFrom(Path.Combine(Common.AddinsSettingDir, "dll", assemblyName + ".dll")); } return null; } 

結語

通過以上的處理後,會發現,Excel催化劑每次自動更新,都只更新核心的程式dll,其他檔案儘可能地放到手動更新上讓使用者按需更新,最終實現了ClickOnce的自動更新模式下的升級瘦身工作。

ClickOnce的自動升級真的好用,讓開發者聚焦在業務程式碼的實現,使用其現有的框架堆程式碼即可實現自動更新,非常值得嘗試使用。

技術交流QQ群

QQ群名:Excel催化劑開源討論群, QQ群號:788145319

 

  Excel催化劑開源討論群二維碼

關於Excel催化劑

Excel催化劑先是一微信公眾號的名稱,後來順其名稱,正式推出了Excel外掛,外掛將持續性地更新,更新的週期視本人的時間而定爭取一週能夠上線一個大功能模組。Excel催化劑外掛承諾個人使用者永久性免費使用!

Excel催化劑外掛使用最新的佈署技術,實現一次安裝,日後所有更新自動更新完成,無需重複關注更新動態,手動下載安裝包重新安裝,只需一次安裝即可隨時保持最新版本!

Excel催化劑外掛下載連結:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

  聯絡作者   公眾號

取名催化劑,因Excel本身的強大,並非所有人能夠立馬享受到,大部分人還是在被Excel軟體所虐的階段,就是頭腦裡很清晰想達到的效果,而且高手們也已經實現出來,就是自己怎麼弄都弄不出來,或者更糟的是還不知道Excel能夠做什麼而停留在不斷地重複、機械、手工地在做著資料,耗費著無數的青春年華歲月。所以催生了是否可以作為一種媒介,讓廣大的Excel使用者們可以瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高階複雜函式的燒腦,最終走向了從入門到放棄的道路。

最後Excel功能強大,其實還需樹立一個觀點,不是所有事情都要交給Excel去完成,也不是所有事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其他更多同樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其他技術,讓Excel能夠發揮更強大的爆發!

關於Excel催化劑作者

姓名:李偉堅,從事資料分析工作多年(BI方向),一名同樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、唯品會)

技術路線從一名普通使用者,通過Excel軟體的學習,從此走向資料世界,非科班IT專業人士。
歷經重重難關,終於在資料的道路上達到技術平原期,學習眾多的知識不再太吃力,同時也形成了自己的一套資料解決方案(資料採集、資料加工清洗、資料多維建模、資料報表展示等)。

擅長技術領域:Excel等Office家族軟體、VBA&VSTO的二次開發、Sqlserver資料庫技術、Sqlserver的商業智慧BI技術、Powerbi技術、雲伺服器佈署技術等等。

2018年開始職業生涯作了重大調整,從原來的正職工作,轉為自由職業者,暫無固定收入,暫對前面道路不太明朗,苦重新回到正職工作,對Excel催化劑的運營和開發必定受到很大的影響(正職工作時間內不可能維護也不可能隨便把工作時間內的成果公佈於外,工作外的時間也十分有限,因已而立之年,家庭責任重大)。

和廣大擁護者一同期盼:Excel催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。