上篇文章主要介绍了webservice的部署以及主要的代码,下面给大家贴上主程序的代码,并简单的讲解。主程序判断是否有更新时通过主程序目录下有一个update.ini文件内的version是否有变化,主要思路为判断客户端的version是否==服务器端webservice提取到的version的值,update.ini文件内容如下:

[update]
version=20132103 //通过这个客户端的version于服务器端的version相比较,如果不等于则为更新
program=BJCreation.CallAppWindow.Windows.exe //主程序的目录,也就是谁要启动这个update.exe[webservice]
url=http://localhost:1546/UpdateWeb/sxsUpdateWebService.asmx //这个就是webservice的地址
method=GetUpdateInfos //webservice的方法名

1、变量定义

//关闭进度条的委托public delegate void CloseProgressDelegate();public delegate void OnGoToShowLogDegate();public delegate void OnGoTOShowRtbLogDelate(object message);//声明关闭进度条事件public event CloseProgressDelegate CloseProgress;string serviceVersion;WebClient wc = null;IniClass ini; //ini文件的操作string url;//获取下载地址 string[] zips;//获取升级压缩包string zip = "";//当前正在下载的压缩包string uploadLog = string.Empty; //更新日志int zipsIndex = 0;//当前正在下载的zips下标long preBytes = 0;//上一次下载流量long currBytes = 0;//当前下载流量private static int time = 3;//3秒自动退出,没有更新的话自动退出string filePath = string.Empty; 

2、构造函数

public FormUpdate(){InitializeComponent();this.btnDownload.Enabled = false;ini = new IniClass(Application.StartupPath + @"\Update.ini");Thread thread = new Thread(new ThreadStart(ThreadMethod));thread.Start();}/// <summary>/// 如果将更新程序放到根目录下面的子目录内,如Realeas/Update/update.exe,则启动时需要传递参数调用这个方法/// 主程序的调用方式如下:process.start("update/update.exe","\""+Application.StartupPath+"\"");因为如果当前目录含有空格类似c:\programes files\程序1 这样的目录,用start方式启动不成功,必须要将start的参数2改为短文件名 或者直接加""的方式 /// 构造窗体/// </summary>/// <param name="path"></param>public FormUpdate( string path ){this.filePath = path;InitializeComponent();this.btnDownload.Enabled = false;ini = new IniClass( Application.StartupPath + @"\Update.ini" );Thread thread = new Thread( new ThreadStart( ThreadMethod ) );thread.Start();}

//通过多线程去处理webservice的读取,防止界面卡死。webservice调用使用了代理的方式,不用添加web引用WebServiceHelper是一个类,实现了webservice的调用。只需要将webservice地址和方法名传递过去即可实现。

        void ThreadMethod(){try{string webServiceUrl = ini.IniReadValue("webservice", "url");//wsdl地址  string method = ini.IniReadValue("webservice", "method");//string[] strArray = (string[])WebServiceHelper.InvokeWebService(webServiceUrl, method, null);//调用webservice并返回结果uploadLog = strArray[3];zips = strArray[2].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);url = strArray[1];string clentVersion = ini.IniReadValue("update", "version");serviceVersion = strArray[0];//服务端版本if (!string.Equals(clentVersion, serviceVersion)){//如果不等则直接显示更新日志及更新列表OnGoToShowLogDegate logHandler = new OnGoToShowLogDegate(ShowLog);this.Invoke(logHandler);}else{OnGoToShowLogDegate logHandler = new OnGoToShowLogDegate(ShowRtbLogView);this.Invoke(logHandler);}}catch (Exception ex){OnGoTOShowRtbLogDelate logHandler = new OnGoTOShowRtbLogDelate(ShowRtbLog);this.Invoke(logHandler, new object[] { ex.Message });}}

更新程序首页日志的展示

void ShowLog(){this.groupBox1.Text = serviceVersion + "更新日志";this.rtbUpdateLog.Text = string.IsNullOrEmpty(uploadLog) ? "暂时无更新" : uploadLog;if (zips.Length > 0){foreach (string item in zips){string size = "";try{HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(new Uri(url + item));HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse();size = GetFileSize(myRes.ContentLength);myRes.Close();}catch (Exception){//如果有异常则不处理}ListViewItem lsv = new ListViewItem();lsv.Text = item;lsv.SubItems.Add(size);this.lsvFiles.Items.Add(lsv);}this.btnDownload.Enabled = true;}}private string GetFileSize(long size){string msg = "0B";if (size == 0){}else if (size > 0 && size < 1024){msg = size + "B";}else if (size > 1024 && size < 1024 * 1024){msg = (size / 1024) + "KB";}else if (size > 1024 * 1024 && size < 1024 * 1024 * 1024){msg = size / (1024 * 1024) + "MB";}return msg;}

下面的是下载和解压的步骤

/// <summary>/// 下载更新/// </summary>private void DownLoad(){try{CloseProgress += new CloseProgressDelegate(FrmUpdate_CloseProgress);if (zips.Length > 0){wc = new WebClient();wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);wc.DownloadFileAsync(new Uri(url + zips[zipsIndex]), zips[zipsIndex]);}else{FrmUpdate_CloseProgress();//调用关闭进度条事件}}catch (Exception ex){MessageBox.Show(ex.Message);}}/// <summary>/// 下载完成后触发/// </summary>void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e){try{if (zipsIndex < zips.Length){//继续下载下一个压缩包wc = new WebClient();wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);string url2 = url + zips[zipsIndex];wc.DownloadFileAsync(new Uri(url2), zips[zipsIndex]);}else{//解压string _path = string.IsNullOrEmpty(filePath) ? Application.StartupPath : filePath;int maximum = ZipClass.GetMaximum(zips, _path);foreach (string zip in zips){string fileName = _path + @"\" + zip;string extension = Path.GetExtension(fileName);if (extension != ".zip"){//如果不是zip的文件则不允许解压。continue;}ZipClass.UnZip(_path + @"\" + zip, "", maximum, FrmUpdate_SetProgress);File.Delete(_path + @"\" + zip);}FrmUpdate_CloseProgress();//调用关闭进度条事件}//此行放置在此处zipsIndex++;}catch (Exception ex){Log.LogToFile(ex.Message);}}/// <summary>/// 下载时触发/// </summary>void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e){if (this.InvokeRequired){this.Invoke(new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged), new object[] { sender, e });}else{try{lblMessage.Text = "正在下载自解压包  " + zips[zipsIndex] + "(" + (zipsIndex + 1).ToString() + "/" + zips.Length + ")";progressBar1.Maximum = 100;progressBar1.Value = e.ProgressPercentage;currBytes = e.BytesReceived;//当前下载流量}catch (Exception){//如果出错,直接运行。}}}/// <summary>/// 解压时进度条事件/// </summary>/// <param name="maximum">进度条最大值</param>private void FrmUpdate_SetProgress(int maximum, string msg){if (this.InvokeRequired){this.Invoke(new ZipClass.SetProgressDelegate(FrmUpdate_SetProgress), new object[] { maximum, msg });}else{timer1.Enabled = false;//this.Text = "升级";if (zipsIndex == zips.Length){//刚压缩完progressBar1.Value = 0;zipsIndex++;}lblMessage.Text = "正在解压" + msg + "(" + (progressBar1.Value + 1).ToString() + "/" + maximum + ")";progressBar1.Maximum = maximum;progressBar1.Value++;}}

网上客户端升级源码下载 ----该程序是由网上的程序修改而来,大家有兴趣可以看看
UpdateWeb的源码下载(需要的可以研究一下,Bin下面有打包好的real)

更新主程序下载(此程序只包含有windows程序,如果报错自行引用Bin目录下面的dll即可。)

如果需要对Update.exe程序进行调用则直接书写

                    Process _process = new Process();_process.StartInfo.FileName = "Update/BJCreation.AutoUpdate.Windows.exe";_process.StartInfo.Arguments="\""+ Application.StartupPath+"\"";_process.StartInfo.WorkingDirectory =Application.StartupPath;_process.Start();

如果将Update.exe放在根目录下,则直接

Process.Start("Update.exe");即可

转载于:https://www.cnblogs.com/smthts/archive/2013/05/15/3080971.html

【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...相关推荐

  1. WinForm程序启动时不显示主窗体的实现方法

    望程序启动时不显示主窗体,而只是在SystemTray显示一个图标:当用户点击该图标时,才第一次显示出主窗体来. 作者在文章中已经说得很清楚,将Form的Visible属性设置为false是不行的,因 ...

  2. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  3. 黑马程序员-三层架构介绍

    ---------------------- Windows Phone 7手机开发. .Net培训.期待与您交流! ---------------------- 三层架构介绍 1关于架构 架构这个词 ...

  4. mfc 更新服务器文件,MFC程序版本自动升级更新

    1.自动升级需要实现两个exe程序的交替启动,需要一个主程序和一个升级程序:在一个解决方案中创建两个项目,一个是你的主程序,另一个为你的升级程序:第二个程序创建选择添加到解决方案,同时选中你要添加的位 ...

  5. c语言软件自动更新,C++简单实现程序自动更新

    许多c艹的hxd想简单滴实现下程序的更新,现在就由小编zfat来讲解下思路 思路 获取网页内容,与程序版本比较 提示:以下是本篇文章正文内容,下面案例可供参考 1.实例 代码如下(示例): strin ...

  6. 2022华中杯数学建模思路实时更新-ABC思路已更新(A一二程序已更新)-4月30日19时

    [关注我,思路实时更新,详细思路持续更新.去年原创思路,被很多机构贩卖,都是免费的,程序也是免费的,以前是您好啊数模君/数模孵化园,现在改名啦,认准:,原创发布,别被坑了] 目录 [详细思路,B已更新 ...

  7. 关闭惠普计算机通电启动注册表,惠普10代cpu电脑装win7卡logo(安装程序正在更新注册表设置)解决方法...

    最近有很多网友问我惠普电脑10代cpu台式机安装win7卡在在更新注册表设置怎么办?出现这种情况一般情况是由于没有提前注入显卡驱动,现在很多新电脑都采用的集成显卡,10代以cpu采用的集显的话,在ue ...

  8. citrix应用程序虚拟化_在Citrix环境中部署和更新Microsoft Access应用程序

    citrix应用程序虚拟化 思杰不灵活 (Citrix is inflexible) This is notorious and for a reason. The environment provi ...

  9. 安装程序无法更新计算机配置,无法安装某些更新或程序

    在尝试下载 ActiveX 控件.安装 Windows 或 Windows 组件的更新.安装 Windows 或 Windows 组件的 Service Pack.或者安装 Microsoft 或第三 ...

最新文章

  1. ps查看oracle进程数,通过ps -ef | grep oracle查出的进程,怎样对应数据库中跑的进程...
  2. python使用教程cmd啥意思-对python中执行DOS命令的3种方法总结
  3. strcpy,strncpy,memcpy,memmove
  4. Office2013 分享
  5. Python个人项目--豆瓣图书个性化推荐
  6. slow log php,善用php-fpm的慢执行日志slow log,分析php性能问题
  7. [转载] 140种Python标准库、第三方库和外部工具
  8. c++ string substr_【函数分享】PHP函数substr ()分享(2020929)
  9. 关于计算机组件游戏,老司机带你解决游戏运行提示缺少组件问题
  10. 实时系统动态内存算法分析dsa(二)——TLSF代码分析
  11. svm神经网络葡萄酒matlab,SVM神经网络的数据分类预测--葡萄酒种类识别
  12. 第8节 破解系统密码—利用win7漏洞和PE系统破解密码
  13. 十七节 samba nfs共享
  14. AcWing 292 炮兵阵地
  15. net start命令发生系统错误5和错误1058的解决方法
  16. 学习笔记-《python程序员面试宝典》-基础知识-数据结构-编程思维(一)
  17. 实现32/64位Windows虚拟扫描仪自定义图片加载
  18. 在线阅读-阿里Java开发手册最强版本【泰山版】
  19. 【NOIP2016提高A组模拟9.24】天使的分裂
  20. 网络流量监控技术与方法

热门文章

  1. 【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)
  2. 用FTP客户端实现主机和虚拟机之间文件的传输(方法2)
  3. Windows 下,使用 Pycharm + Anaconda(NumPy,SciPy 等集成包)的环境配置
  4. pythonsubprocess执行多条shell命令_python中subprocess批量执行linux命令
  5. java运行安全_Java运行时环境
  6. AI成为世界互联网大会重要议题 第四范式AutoML登上央视
  7. 【算法】算法岗需要顶会才能入场?
  8. 【论文推荐】张笑钦团队 | 综述:基于深度学习的视觉跟踪方法进展
  9. 【深度学习】后ResNet时代的顶流EfficientNet
  10. 从吴恩达AI For Everyone中学到的十个重要AI观