2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报
 分类:
c#2005(27) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

winform 应用系统的部署问题,一直是个令人苦恼的问题。在2.0下,我们可以通过clickonce方式部署,但是这里要说的,是利用文件的操作来对系统进行更新。

为了方便用户作业,把实际的系统打包成DLL存在,而设计一个自动更新的form来作为用户启动的入口。用户启动后,实现自动检测服务端和客户端系统文件版本,并把所有所需文件更新至最新版本。而后自动启动系统入口界面。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Reflection;
  9. using System.Threading;
  10. using System.Net;
  11. using System.IO;
  12. namespace autoUpdateAndCallFormDll
  13. {
  14. /// <summary>
  15. /// 1.启动时,实现自动更新
  16. /// 2.可把不同模块打包DLL,在运行时,利用反射机制调用DLL 中form(类)。
  17. ///
  18. /// 为了准确显示更新画面,并在更新完毕后调用Dll,采用异步方式。
  19. /// </summary>
  20. public partial class Form1 : Form
  21. {
  22. public Form1()
  23. {
  24. InitializeComponent();
  25. backgroundWorker1.RunWorkerAsync(); //异步更新作业
  26. }
  27. private void callMainForm()
  28. {
  29. //Dynamic Call Form using Assembly
  30. Assembly assembly = Assembly.LoadFrom(@"D:/TEST/SD.dll");
  31. Form frm = assembly.CreateInstance("SD.frmmain") as Form;
  32. frm.Show();
  33. frm.Activate();
  34. this.Visible = false;
  35. }
  36. private void updateDll()
  37. {
  38. string fileName = @"D:/TEST" + "//" + "dd.dll";   //本机路径
  39. string url = @"http://webtest/ServerDownload" + "/" + "a.dll";  //服务端路径
  40. try
  41. {
  42. //采用http方式进行更新,避免网络,文件夹权限的限制。
  43. WebRequest myWebRequest = WebRequest.Create(url);
  44. WebResponse myWebResponse = myWebRequest.GetResponse();
  45. Stream receiveStream = myWebResponse.GetResponseStream();
  46. //先删除历史文件
  47. File.Delete(fileName);
  48. FileStream fs = new FileStream(fileName, FileMode.CreateNew);
  49. try
  50. {
  51. List<byte> lstByte = new List<byte>();
  52. while (true)
  53. {
  54. //讀一個byte, 寫一個byte
  55. int i = receiveStream.ReadByte();
  56. if (i == -1)
  57. {
  58. break;
  59. }
  60. fs.WriteByte(Convert.ToByte(i));
  61. }
  62. }
  63. finally
  64. {
  65. if (fs != null)
  66. fs.Close();
  67. myWebResponse.Close();
  68. }
  69. }
  70. catch (Exception ex)
  71. {
  72. throw ex;
  73. }
  74. finally
  75. {
  76. WebRequest.DefaultWebProxy = null;
  77. }
  78. }
  79. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  80. {
  81. Thread.Sleep(3000);  //为了清晰的看到更新,可采用此方式
  82. updateDll(); //异步更新文件
  83. }
  84. private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  85. {
  86. callMainForm();  //异步作业完毕,调用此方法
  87. }
  88. }
  89. }

范例是一个简单的实现,实际作业中,可以对目录操作,对每个文件的版本(或者最后修改时间)进行比对,如果有新版本出现,则更新。

要点:

1.版本比对

2.异步作业(backgroundworker组件)

3.http方式实现文件下载(webRequest类)

4.反射机制,实现form动态调用
    5.服务器端文件夹要在IIS中建立虚拟目录,以实现http访问

winform实现自动更新并动态调用form实现的更多相关文章

  1. C#[WinForm]实现自动更新

    C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...

  2. WinForm通用自动更新器AutoUpdater项目实战

    一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...

  3. 使用 advanced installer 为 winform 做自动更新

    原文:使用 advanced installer 为 winform 做自动更新 advanced installer 是一款打包程序,基于 windows installer 并扩展了一些功能,比如 ...

  4. winform版本自动更新

    我们在使用软件的时候经常会遇到升级版本,这也是Winform程序的一个功能,今天就大概说下我是怎么实现的吧(代码有点不完美有小BUG,后面再说) 先说下我的思路:首先在打开程序的时候去拿到我之前在网站 ...

  5. winform 通用自动更新程序

    通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...

  6. WinForm通用自动更新AutoUpdater项目实战

    目前我们做的上位机项目还是以Winform为主,在实际应用过程中,可能还会出现一些细节的修改.对于这种情况,如果上位机带有自动更新功能,我们只需要将更新后的应用程序打包放在指定的路径下,可以让用户自己 ...

  7. .net winform软件自动更新

    转载自 http://dotnet.chinaitlab.com/DotNetFramework/914178.html 关于.NET windows软件实现自动更新,本人今天写了一个DEMO,供大家 ...

  8. C#Winform实现自动更新

    服务端: [WebMethod] public string GetNewService(string version) { //通过版本号进行比较 if (version == "v1.0 ...

  9. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

随机推荐

  1. Feature Flag

    know more from here: https://www.youtube.com/watch?v=WMRjj06R6jg&list=UUkQX1tChV7Z7l1LFF4L9j_g F ...

  2. hadoop聚群的安装

    第一部分,安装单机hadoop 1,安装ssh sudo apt-get install ssh 注意:如果执行不了这句,那就先执行:sudo apt-get update 2,安装rsync sud ...

  3. sql中临时表的创建和使用【本文转自多人博客】

    本模块原网址:http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/05/1526466.html 原作者:Jeff Wong 1.创建方 ...

  4. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  5. [SQL Server系] -- 基本概念

    以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有  一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...

  6. Oracle 学习笔记(三)

    1.插入有日期的表,使用 to_date 函数 to_date('1992-12-07', 'yyyy-mm-dd'); 2.使用update更新语句的时候,既可以使用表达式或者数值直接修改数据,也可 ...

  7. 张小龙谈如何写E-mail软件

    编者语:鼎鼎大名的Foxmail软件制作者,你一定不会陌生吧!本刊第三期特刊还刊登过此君的生活照一张,可谓威风八面.小编此次突发奇想,“死缠烂打”,费了九牛二虎之力,终于约他写了一篇有关写E-mail ...

  8. ios开发--27个提升效率的iOS开源库推荐

    超长慎入列表: DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core D ...

  9. Loongnix 系统(MIPS Linux)

    电脑上的x86,手机上的ARM,在各自领域都是很成熟的CPU架构了,龙芯也参与进去竞争是很难的,就算是Intel,挤破头皮疯狂补贴自家的Atom x86还是在手机领域无法立足. 所以说,个人觉得龙芯可 ...

  10. esriControlsMousePointer 控制鼠标指针

    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; 控制鼠标指针选项. 不变 值 描述 esriPo ...