分类:
c#2005(27)
版权声明:本文为博主原创文章,未经博主允许不得转载。
winform 应用系统的部署问题,一直是个令人苦恼的问题。在2.0下,我们可以通过clickonce方式部署,但是这里要说的,是利用文件的操作来对系统进行更新。
为了方便用户作业,把实际的系统打包成DLL存在,而设计一个自动更新的form来作为用户启动的入口。用户启动后,实现自动检测服务端和客户端系统文件版本,并把所有所需文件更新至最新版本。而后自动启动系统入口界面。
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Reflection;
- using System.Threading;
- using System.Net;
- using System.IO;
- namespace autoUpdateAndCallFormDll
- {
- /// <summary>
- /// 1.启动时,实现自动更新
- /// 2.可把不同模块打包DLL,在运行时,利用反射机制调用DLL 中form(类)。
- ///
- /// 为了准确显示更新画面,并在更新完毕后调用Dll,采用异步方式。
- /// </summary>
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- backgroundWorker1.RunWorkerAsync(); //异步更新作业
- }
- private void callMainForm()
- {
- //Dynamic Call Form using Assembly
- Assembly assembly = Assembly.LoadFrom(@"D:/TEST/SD.dll");
- Form frm = assembly.CreateInstance("SD.frmmain") as Form;
- frm.Show();
- frm.Activate();
- this.Visible = false;
- }
- private void updateDll()
- {
- string fileName = @"D:/TEST" + "//" + "dd.dll"; //本机路径
- string url = @"http://webtest/ServerDownload" + "/" + "a.dll"; //服务端路径
- try
- {
- //采用http方式进行更新,避免网络,文件夹权限的限制。
- WebRequest myWebRequest = WebRequest.Create(url);
- WebResponse myWebResponse = myWebRequest.GetResponse();
- Stream receiveStream = myWebResponse.GetResponseStream();
- //先删除历史文件
- File.Delete(fileName);
- FileStream fs = new FileStream(fileName, FileMode.CreateNew);
- try
- {
- List<byte> lstByte = new List<byte>();
- while (true)
- {
- //讀一個byte, 寫一個byte
- int i = receiveStream.ReadByte();
- if (i == -1)
- {
- break;
- }
- fs.WriteByte(Convert.ToByte(i));
- }
- }
- finally
- {
- if (fs != null)
- fs.Close();
- myWebResponse.Close();
- }
- }
- catch (Exception ex)
- {
- throw ex;
- }
- finally
- {
- WebRequest.DefaultWebProxy = null;
- }
- }
- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
- {
- Thread.Sleep(3000); //为了清晰的看到更新,可采用此方式
- updateDll(); //异步更新文件
- }
- private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- callMainForm(); //异步作业完毕,调用此方法
- }
- }
- }
范例是一个简单的实现,实际作业中,可以对目录操作,对每个文件的版本(或者最后修改时间)进行比对,如果有新版本出现,则更新。
要点:
1.版本比对
2.异步作业(backgroundworker组件)
3.http方式实现文件下载(webRequest类)
4.反射机制,实现form动态调用
5.服务器端文件夹要在IIS中建立虚拟目录,以实现http访问