转载自 http://dotnet.chinaitlab.com/DotNetFramework/914178.html

关于.NET windows软件实现自动更新,本人今天写了一个DEMO,供大家参考。

        大家先看下效果图:

       主要涉及到两个方面

1. 更新软件主项目和DLL文件

2.升级包自身的更新

1.   一个项目通常包括主项目和类库项目,主项目就是启动项目,以.exe结尾,类库项目主要是DLL, 简单的说更新就是将软件本地的主项目和类库项目进行更新。

可以采用将最新的软件放到一个远程服务器上,然后每次启动本地软件时候,检查如果有更新,就从服务器下载最新的.EXE文件和DLL文件,

来替换本地的DLL文件和exe文件

实现思路:在本地和服务器上各放一个XML文件,里面记录了软件版本号,发布日期,要更新的DLL等一些信息,如果发现本地软件的版本号和服务器上的不相等,或者

本地软件中的类库项目的发布时间比服务上的晚,就开始下载服务器上的文件,替换掉本地的文件。

        XML格式如下

  <?xml version="1.0" encoding="utf-8"?>
<AutoUpdater>
<AppName>WinUpdate</AppName>
<ReleaseURL>http://127.0.0.1/webdown/</ReleaseURL>
<ReleaseDate>2012/3/1 10:42:34</ReleaseDate>
<ReleaseVersion>1.0.1.99</ReleaseVersion>
<MinVersion>1.0.1.88</MinVersion>
<UpdateDes>
1、 添加打印菜单
2、 增加DLL
3、增加关于模块
</UpdateDes>
<ApplicationStart>WinUpdate.exe</ApplicationStart>
<ShortcutIcon>ico</ShortcutIcon>
<Releases>
<File name="AboutForm.dll" date="2012/2/21 10:07:31" size="39" />
</Releases>
</AutoUpdater>
         public static void DownloadFile(string localFolder, string remoteFolder, string fileName, ProgressBar bar,
Label lblSize)
{
string url = remoteFolder + "/" + fileName;
string path = localFolder+ fileName;
string dir = Path.GetDirectoryName(path);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
WebRequest req = WebRequest.Create(url);
WebResponse res = req.GetResponse();
if (res.ContentLength == 0)
return;
long fileLength = res.ContentLength;
string totalSize = FormatFileSizeDescription(bar.Maximum);
using (Stream srm = res.GetResponseStream())
{
var srmReader = new StreamReader(srm);
var bufferbyte = new byte[fileLength];
int allByte = bufferbyte.Length;
int startByte = 0;
while (fileLength > 0)
{
int downByte = srm.Read(bufferbyte, startByte, allByte);
if (downByte == 0)
{
break;
}
;
startByte += downByte;
allByte -= downByte;
int progress = bar.Value + downByte;
progress = progress > bar.Maximum ? bar.Maximum : progress;
bar.Value = progress;
lblSize.Text = string.Format("已完成{0}/{1}", FormatFileSizeDescription(progress), totalSize);
}
var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(bufferbyte, 0, bufferbyte.Length);
srm.Close();
srmReader.Close();
fs.Close();
}
}
}

2.关于升级包自身的更新,采用如下思路,在服务器上放置一个TXT文件,里面存放着升级包的版本号,每次本地软件启动的时候,

读取服务器上TXT文件的版本号和本地升级包的版本信息进行比较,如果不同,就从服务器上下载升级包。

关于下载本项目都是使用WebClient进行完成的。

自己可以采用如下方式进行测试

首先,在你的IIS下面建立一个虚拟目录:http://127.0.0.1/webdown ,此目录用来放置要更新的文件,内容如下

1.ReleaseList.xml和1.0.4.98文件夹主要是实现软件更新

ReleaseList.xml存放了需要更新的内容。1.0.4.98文件夹存放了需要更新的类库和文件

2.  AutoUpdate.exe,UpdaterVerson.txt这两个文件实现的升级包自身进行更新.

AutoUpdate.exe是升级包,UpdaterVerson.txt存放的是升级包的版本号

将以上内容部署到IIS下面

.net winform软件自动更新的更多相关文章

  1. WinForm通用自动更新器AutoUpdater项目实战

    一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...

  2. C#[WinForm]实现自动更新

    C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...

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

    winform实现自动更新并动态调用form实现 标签: winform作业dllbytenull服务器 2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报  分类: c#200 ...

  4. Android - 软件自动更新的实现

    转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的 ...

  5. 使用 advanced installer 为 winform 做自动更新

    原文:使用 advanced installer 为 winform 做自动更新 advanced installer 是一款打包程序,基于 windows installer 并扩展了一些功能,比如 ...

  6. WinForm通用自动更新AutoUpdater项目实战

    目前我们做的上位机项目还是以Winform为主,在实际应用过程中,可能还会出现一些细节的修改.对于这种情况,如果上位机带有自动更新功能,我们只需要将更新后的应用程序打包放在指定的路径下,可以让用户自己 ...

  7. 如何屏蔽 iOS 软件自动更新,去除更新通知和标记

    适用于 iOS.iPadOS 和 watchOS,即 iPhone.iPad 和 Apple Watch 通用. 请访问原文链接:https://sysin.org/article/Disable-i ...

  8. C#Winform实现自动更新

    服务端: [WebMethod] public string GetNewService(string version) { //通过版本号进行比较 if (version == "v1.0 ...

  9. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

随机推荐

  1. apache安装后编译新模块

    1.下载对应版本的源码包 2.解压后找到modules/mappers目录并进入 3.运行如下命令自动编译.安装和修改httpd.conf文件: /usr/sbin/apxs -c -i -a mod ...

  2. android- FileProvider崩溃 - NPE试图调用一个空字符串XmlResourceParser(FileProvider crash - npe attempting to invoke XmlResourceParser on a null String)

    问题: This is a part of my manifest: <?xml version="1.0" encoding="utf-8"?> ...

  3. URAL 1936 Roshambo 题解

    http://acm.timus.ru/problem.aspx?space=1&num=1936 F - Roshambo Time Limit:1000MS Memory Limit:65 ...

  4. javascript常量

    javascript中没有常量的概念,虽然许多现代的变成环境可能为您提供了用以创建常量的const语句.对于的自己的变量,可以采用相同的命名约定,并且将他们以静态属性的方式添加到构造函数中. //构造 ...

  5. 使用Unity创造动态的2D水体效果

    者:Alex Rose 在本篇教程中,我们将使用简单的物理机制模拟一个动态的2D水体.我们将使用一个线性渲染器.网格渲染器,触发器以及粒子的混合体来创造这一水体效果,最终得到可运用于你下款游戏的水纹和 ...

  6. CUDA 6.5 && VS2013 && Win7:创建CUDA项目

    运行环境: Win7+VS2013+CUDA6.5 1.创建win32空项目 2.右键项目解决方案-->生成项目依赖项-->生成自定义 3.右键项目解决方案-->属性-->配置 ...

  7. 从Trie谈到AC自动机

    ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...

  8. Scrapy and Selenium

    How to scrapy js? scrapy结合webkit抓取js生成的页面 http://www.cnblogs.com/Safe3/archive/2011/10/19/2217965.ht ...

  9. 【Django】Django 直接执行原始SQL 如何防止SQL注入 ?

    代码示例: #错误--不要直接格式化字符串 query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname Person.objec ...

  10. object-c面向对象2

    我们知道在c#中有访问私有成员变量的get  和set方法.这个目的是用来公开实力对象的私有变量.我看了下ios的访问修饰符.也就是private,public,protected.这些基本上都和c# ...