winform實現自動更新並動態調用form實現

    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.         }
  37.         private void updateDll()
  38.         {
  39.             string fileName = @"D:/TEST" + "//" + "dd.dll";   //本機路徑
  40.             string url = @"http://webtest/ServerDownload" + "/" + "a.dll";  //服務端路徑
  41.             try
  42.             {
  43.                 //採用http方式進行更新,避免網絡,文件夾權限的限制。
  44.                 WebRequest myWebRequest = WebRequest.Create(url);
  45.                 WebResponse myWebResponse = myWebRequest.GetResponse();
  46.                 Stream receiveStream = myWebResponse.GetResponseStream();
  47.                 //先刪除歷史文件
  48.                 File.Delete(fileName);
  49.                 FileStream fs = new FileStream(fileName, FileMode.CreateNew);
  50.                 try
  51.                 {
  52.                     List<byte> lstByte = new List<byte>();
  53.                     while (true)
  54.                     {
  55.                         //讀一個byte, 寫一個byte
  56.                         int i = receiveStream.ReadByte();
  57.                         if (i == -1)
  58.                         {
  59.                             break;
  60.                         }
  61.                         fs.WriteByte(Convert.ToByte(i));
  62.                     }
  63.                 }
  64.                 finally
  65.                 {
  66.                     if (fs != null)
  67.                         fs.Close();
  68.                     myWebResponse.Close();
  69.                 }
  70.                
  71.             }
  72.             catch (Exception ex)
  73.             {
  74.                 throw ex;
  75.             }
  76.             finally
  77.             {
  78.                 WebRequest.DefaultWebProxy = null;
  79.             }
  80.         }
  81.         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  82.         {
  83.             Thread.Sleep(3000);  //爲了清晰的看到更新,可採用此方式
  84.             updateDll(); //異步更新文件
  85.         }
  86.         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  87.         {
  88.             callMainForm();  //異步作業完畢,調用此方法
  89.         }
  90.     }
  91. }

    範例是一個簡單的實現,實際作業中,可以對目錄操作,對每個文件的版本(或者最後修改時間)進行比對,如果有新版本出現,則更新。

    要點:

    1.版本比對

    2.異步作業(backgroundworker組件)

    3.http方式實現文件下載(webRequest類)

    4.反射機制,實現form動態調用
    5.服務器端文件夾要在IIS中建立虛擬目錄,以實現http訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章