excel编程辅助器:Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术
excel编程辅助器:Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术
2024-11-08 07:47:30  作者:追求死亡  网址:https://m.xinb2b.cn/sport/rep265173.html

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的自动升级真的好用,让开发者聚焦在业务代码的实现,使用其现有的框架堆代码即可实现自动更新,非常值得尝试使用。

  • 谁都会唱的经典歌曲(谁都可以唱第十三节)
  • 2024-11-08谁都可以唱第十三节关于《谁都“可”以唱》:《谁都“可”以唱》是小乐感音乐分享平台网络互动教学课堂《音悦课》的首个系列由著名少儿声乐老师章可老师发起章老师希望越来越多的孩子能爱唱歌,唱好歌,让歌唱成为陪伴孩子们成长的好伙。
  • 小叶紫檀手串不能和什么一起(来说说小叶紫檀手串的讲究禁忌)
  • 2024-11-08来说说小叶紫檀手串的讲究禁忌佛珠不能说买,要说请,跟佛像一样,请一串佛珠,请一尊佛像,这叫结缘价格都可以说,但不能说买开过光的要带左手,许多人信奉“男左女右”的说法,认为女人戴手串就要戴在右手上然而在寺庙开过光的手串一般要戴在左。
  • 原神电脑任务栏是哪个按键
  • 2024-11-08原神电脑任务栏是哪个按键Esc键是任务栏菜单,其它按健如下:移动:W/A/S/D、普攻:鼠标左键、元素战技:E、冲刺:左Shift/鼠标右键、跳跃:空格键、元素爆发:Q、背包栏:I、角色界面:K、地图:M、派蒙界面:Esc、。
  • 三国手游有哪些(三国手游有什么游戏)
  • 2024-11-08三国手游有什么游戏《三国志·战略版》这款游戏将帮助玩家还原一个最真实的三国战场,经典的三国策略玩法,玩家将通过招募良将培养自己的势力,在这个乱世中找到自己的立足之地,想要强大自己,就需要不断的谋划《放开那三国3》经典的。
  • 张艺兴为什么不做pd(张PD小绵羊张艺兴)
  • 2024-11-08张PD小绵羊张艺兴张艺兴,本名(张加帅),英文名(LAY),歌手/演员,1991年10月7日出生于湖南长沙,身高178cm,体重60kg,A型血,天秤座♎️代表作品:老九门,好先生,功夫瑜伽,求婚大作战等特长:画画,作。
  • 盒饭哪些比较好吃(盒饭真的没有营养吗)
  • 2024-11-08盒饭真的没有营养吗盒饭在大家的认知中,可能就是几块钱的廉价货,凑合填饱肚子,应付饥饿,而在此地,盒饭最低都是28块钱起价现在吃盒饭的几乎都是工地上做体力活的工人们,或者是车站赶路的行人们,5块、10块、15的盒饭都有,。
  • (哪些因素会导致阴囊湿疹的出现)
  • 2024-11-08哪些因素会导致阴囊湿疹的出现1、前列腺炎因为阴囊湿疹是前列腺炎导致的植物神经功能紊乱所造成的,随着前列腺炎的好转和治愈,阴囊湿疹会间断出现直至消失但如果前列腺炎治疗不当或不彻底,阴囊湿疹是不会消失的2、肾虚阴囊湿疹是一种肾精外泄。
  • 给祖先上坟烧纸的禁忌 古人说要想富敬祖父
  • 2024-11-08给祖先上坟烧纸的禁忌 古人说要想富敬祖父清明节是我们传统文化中最重要的一个节日,人们在这天去给先人扫墓,以表示自己对先人的怀念,同时,清明祭祖、扫墓的行为,更是传统孝文化的体现孝文化在儒家的影响下,孝文化经过千百年的发展,成为了我们民族的血。
  • 葫芦丝王老先生谱子(张果老倒骑小毛驴)
  • 2024-11-08张果老倒骑小毛驴中秋晚会过了好几天了,突然在某场中秋晚会上的假表演在网上引起了热议事情是这样的,在黑龙江齐齐哈尔市文联主办的中秋晚会上,一名女演员在舞台上全程倒着吹葫芦丝,真真是当着观众的面完成了一场假表演在视频中可。
  • 元气骑士初始武器排行(元气骑士首富账号评选)
  • 2024-11-08元气骑士首富账号评选今年的胡润百富榜已经发布,二马依旧以较大优势成功霸榜!那么如果要在我们元气骑士中要评选首富账号究竟该如何评选呢?根据玩家们的集体意见,我们制定了地牢首富评选表,对照此表看看你的账号能否跻身地牢百富呢?。
  • 请回答1988德善和狗焕的合照 请回答1988狗焕和德善
  • 2024-11-08请回答1988德善和狗焕的合照 请回答1988狗焕和德善还记得《请回答1988》中的狗焕和德善吗?多少粉丝的遗憾,现实中他们在一起了,网友大呼:这狗粮我愿意吃!惠利和柳俊烈两人因戏生情,在《请回答1988》剧中惠利与朴宝剑饰演的天才少年崔泽才是最终的一对,。