• winform实现自动更新并动态调用form实现


    winform实现自动更新并动态调用form实现

    标签: winform作业dllbytenull服务器
     分类:
     

        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访问

  • 相关阅读:
    【NYOJ】[57]6174问题
    【NYOJ】[56]阶乘因式分解(一)
    【NYOJ】[56]阶乘因式分解(一)
    【看书】for,(do-)while的循环体执行
    【看书】for,(do-)while的循环体执行
    【NYOJ】[41]三个数从小到大排序
    【NYOJ】[41]三个数从小到大排序
    EndNote X7大客户版破解版
    [TomTom]安卓汉化版v1.3,中国及海外地图懒人包
    [TomTom]安卓汉化版v1.3,中国及海外地图懒人包
  • 原文地址:https://www.cnblogs.com/skyay/p/5311202.html
Copyright © 2020-2023  润新知