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. iOS 通过代码关闭应用程序

    //-------------------------------- 退出程序 -----------------------------------------// - (void)exitAppl ...

  2. spring测试父类,使用junit-4.4.jar,spring-test.jar

    @ContextConfiguration(locations = "classpath:conf/applicationContext.xml") @RunWith(Spring ...

  3. 去除List集合中的重复对象,Map遍历代码

    /*** * 去除List<PartsInfoDTO>列表中的重复对象 ~!! * @param list * @return */ public static List<Parts ...

  4. ASP .NET 如何在 SQL 查询层面实现分页

    [编者按]本文作者为来自巴基斯坦的软件开发工程师 Aqeeel,主要介绍了在 SQL 查询层面实现 ASP.NET 应用的分页方法. 本文系 OneAPM 工程师编译呈现,以下为正文. GridVie ...

  5. POJ 1363 Rails(栈)

    思路:将出车站的顺序存入数组train,由于入车站的顺序是固定的,为1~N,所以用P表示进站的车,初始为1. 接下来举例说明吧: 原来入站顺序:    1 2 3 4 5 读入的出战顺序: 3 4 2 ...

  6. POJ 1691 Painting A Board(DFS)

    链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子. ...

  7. hdu 2177 取(2堆)石子游戏 博弈论

    由于要输出方案,变得复杂了.数据不是很大,首先打表,所有whthoff 的奇异局势. 然后直接判断是否为必胜局面. 如果必胜,首先判断能否直接同时相减得到.这里不需要遍历或者二分查找.由于两者同时减去 ...

  8. struts2学习笔记(3)——struts2的局部类型转换

    今天又学到了一个新的东西,就是struts2的类型转换. 为什么要类型转换? 今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存. 因为在表单里面传过去的是字符串,如“12,23”, ...

  9. sql语句面试总结

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  10. java @param参数注解

    注解,@param是参数的解释.如/***@param s 这里表示对s的文字说明,描述 */ public void aa(String s){}一般java中@表示注解,解释一个方法,类,属性的作 ...