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訪問