首页  ·  知识 ·  编程语言
winform实现自动更新并动态调用form
佚名  本站原创  .NET  编辑:dezai  图片来源:网络
winform 应用系统的部署问题,一直是个令人苦恼的问题。在2.0下,我们可以通过clickonce方式部署,但是这里要说的,是利用文件的操作来对系统进行更新。
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
{
///
/// 1.启动时,实现自动更新
/// 2.可把不同模块打包DLL,在运行时,利用反射机制调用DLL 中form(类)。
///
/// 为了准确显示更新画面,并在更新完毕后调用Dll,采用异步方式。
///

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 lstByte = new List();
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访问 本文作者:佚名 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读