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

版权声明:本文为博主原创文章,未经博主允许不得转载。
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访问
winform实现自动更新并动态调用form实现的更多相关文章
- C#[WinForm]实现自动更新
C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...
- WinForm通用自动更新器AutoUpdater项目实战
一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...
- 使用 advanced installer 为 winform 做自动更新
原文:使用 advanced installer 为 winform 做自动更新 advanced installer 是一款打包程序,基于 windows installer 并扩展了一些功能,比如 ...
- winform版本自动更新
我们在使用软件的时候经常会遇到升级版本,这也是Winform程序的一个功能,今天就大概说下我是怎么实现的吧(代码有点不完美有小BUG,后面再说) 先说下我的思路:首先在打开程序的时候去拿到我之前在网站 ...
- winform 通用自动更新程序
通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...
- WinForm通用自动更新AutoUpdater项目实战
目前我们做的上位机项目还是以Winform为主,在实际应用过程中,可能还会出现一些细节的修改.对于这种情况,如果上位机带有自动更新功能,我们只需要将更新后的应用程序打包放在指定的路径下,可以让用户自己 ...
- .net winform软件自动更新
转载自 http://dotnet.chinaitlab.com/DotNetFramework/914178.html 关于.NET windows软件实现自动更新,本人今天写了一个DEMO,供大家 ...
- C#Winform实现自动更新
服务端: [WebMethod] public string GetNewService(string version) { //通过版本号进行比较 if (version == "v1.0 ...
- C# WINFORM的自动更新程序
自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...
随机推荐
- Capsule:开源的 JVM 应用部署工具
[编者按]本文作者 Ron Pressler 是 Parallel Universe 公司的创始人,拥有着丰富的高性能开发经验.通过这篇文章,Ron 向大家详细介绍了全新的开源 JVM 部署工具--C ...
- HDU4758 Walk Through Squares AC自动机&&dp
这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...
- React vs Angular 2: 冰与火之歌
黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...
- POJ 3411 Paid Roads(SPFA || DFS)
题目链接 题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长. 思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态 ...
- jsp是有自己的编译引擎的
什么是jsp? JSP(Java Server Pages)是指: 在HTML中嵌入Java脚本代码 由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码 然后将生成的整个页面信息返回给客户端 ...
- NPOI读取Excel,导入数据到Excel练习01
NPOI 2.2.0.0,初级读取导入Excel 1.读取Excel,将数据绑定到dgv上 private void button1_Click(object sender, EventArgs e) ...
- [cocoapods] 如何卸载工程里的cocoapods
1. 打开自己的工程所在文件夹 删除这4个文件 2. 打开工程,把红线的东西都删除掉 3. 只留下原来的4个,其余都删除掉
- 58. Length of Last Word
题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...
- ipc$漏洞利用实例
一.什么是IPC$ IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道, 通过提供可信任的用户名和口令 ...
- 第二十二章 CLR寄宿和AppDomain
1. 概念解析 CLR Hosting(CLR 宿主):初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只不过由于PE ...