mysql 更新 自我_ClickOnce DIY全自动更新下载升级的自我实现

ClickOnce DIY全自动更新下载升级的自我实现

更新时间:2007年08月15日 20:13:44   作者:

SmartClient概念近来比较热,但在微软提出这个名词以前已经有大量的软件在这么做了,一方面是简化客户端的部署,一方面是提供自动升级的功能;对于传统的WinForm应用来讲,确实是可以降低维护成本的一个不错的解决方案;

微软在推出SmartClient概念时,推出了相关的updater的Application Block,做的也蛮不错,但作者前段还是根据软件特性自己写了一个很简单的实现,大家也大概能了解一下原理:

笔者的简化版自动升级管理器只需要四步走:

1.一个负责查找和下载新版本的本地类

2.本地配置文件中(或在代码中硬编码?不太好吧),指向更新服务器的URL

3.服务器上一个标识版本号和新文件URL的配置文件

4.调用示例

1.版本管理类

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

using System.Net;

using System.IO;

using System.Windows.Forms;

namespace Survey

{

class VersionAgent

{

public static bool CheckNetwork()

{

HttpWebRequest request;

try

{

request = (HttpWebRequest)WebRequest.Create(Pub.GetSetting("UpdateUrl") );//从本地配置文件获取的网络中配置文件的URL

request.Proxy = WebProxy.GetDefaultProxy();

request.GetResponse();//如果可以获得响应,说明网络没问题

}

catch (Exception e)

{

Pub.logError(e);

return false;

}

return true;

}

public static bool CheckUpdate()

{

XmlDocument doc = loadXMLDocument(Pub.GetSetting("UpdateUrl"));

Sys.UpdateUrl = GetValue(doc, "DownloadURL").Trim();//将来会用这个URL自动下载

Sys.UpdatePage = GetValue(doc, "DownloadPage").Trim();//如自动下载失败,会提供到这个页面手工下载

string warningRate = GetValue(doc, "WarningRate").Trim();

float.TryParse(warningRate,out Sys.WarningRate);

string NetVersion = GetValue(doc, "Version").Trim();

Version LocalVersion=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

return new Version(NetVersion).CompareTo(new Version(LocalVersion))>0;//大于0说明有新版本发布

}//这个方法是载入网络配置文件,读取一些不想放在本地的配置参数,以及比较本地和网络版本号

public static bool GoUpdate()

{

return DownLoadFile(Sys.UpdateFile,Sys.UpdateUrl);

}

public static string GetValue(XmlDocument doc, string Key)

{

string Value;

try

{

XmlElement elem = (XmlElement)doc.SelectSingleNode(@"/config/app/" + Key);//读取配置文件可自行定义

Value = elem == null ? "" : elem.GetAttribute("value");

}

catch

{

Value = "";

}

return Value;

}

public static XmlDocument loadXMLDocument(string FileNameOrUrl)

{

XmlDocument doc = null;

try

{

doc = new XmlDocument();

doc.Load( FileNameOrUrl);

}

catch (Exception e)

{

System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

doc = null;

}

return doc;

}

public static bool DownLoadFile(string FileName, string Url)

{

bool Value = false;

WebResponse response = null;

Stream stream = null;

try

{

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

response = request.GetResponse();

stream = response.GetResponseStream();

if (!response.ContentType.ToLower().StartsWith("text/"))

{

Value = SaveBinaryFile(response, FileName);

}

}

catch (Exception e)

{

// System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

}

return Value;

}

private static bool SaveBinaryFile(WebResponse response, string FileName)

{

bool Value = true;

byte[] buffer = new byte[1024];

try

{

if (File.Exists(FileName))

File.Delete(FileName);

Stream outStream = System.IO.File.Create(FileName);

Stream inStream = response.GetResponseStream();

int l;

do

{

l = inStream.Read(buffer, 0, buffer.Length);

if (l > 0)

outStream.Write(buffer, 0, l);

}

while (l > 0);

outStream.Close();

inStream.Close();

}

catch (Exception e)

{

System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

Value = false;

}

return Value;

}

}

}

2.本地配置文件可能如:

3.网络配置文件可能如:

4.调用示例

在认为合适的时机(比如说应用程序启动时),启动一个后台线程去工作:

Thread thread = new Thread(new ThreadStart(threadMethodUpdate));

thread.Start();

private void threadMethodUpdate()

{

if (VersionAgent.CheckNetwork())//网络状况正常

{

if (VersionAgent.CheckUpdate())//检查更新并获取网络参数

{

if (VersionAgent.GoUpdate())//获取新版本(由于我的软件很小,所以在不提示用户的情况就进行了新版下载,如认为不妥,可通过MessageBox提示一下)

{

MessageBox.Show("检测到产品的更新版本,即将开始自动更新!", "版本升级", MessageBoxButtons.OK, MessageBoxIcon.Information);

System.Diagnostics.Process.Start(Sys.UpdateFile);

System.Environment.Exit(0);

}

else

{

MessageBox.Show("系统检测到更新版本,但自动下载失败,点击确定进行手动下载", "版本升级", MessageBoxButtons.OK, MessageBoxIcon.Error);

System.Diagnostics.Process.Start(Sys.UpdatePage);

System.Environment.Exit(0);

}

}

}

else//也可以什么也不提示

MessageBox.Show("无法连接到服务器进行自动升级!\n请检查网络连接 " + Pub.GetSetting("UpdateUrl"), "网络异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要为大家详细介绍了如何在Visual Studio中创建一个新项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-06-06

4f55910a645b073bc4fc65dc10dc14bd.png

判断文件路径是否存在的方法有很多,在本文为大家介绍下c#中时如何判断文件及文件路径是否存在,感兴趣的朋友不要错过2013-10-10

0ea3c7666119d5615e582f823fb3fad6.png

这篇文章主要介绍了把.net Core 项目迁移到VS2019 for MAC的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-03-03

4f96a78db829b1556ff16de21e013c7a.png

C#里没有动态的数组,只能用arraylist或list取代。2009-06-06

8cc1031babc6aff2319f1c6af8544aa0.png

VS2015内置的C#版本为6.0,提供了一些新特性,这篇文章主要为大家详细介绍了VS2015中C#版本6.0的8种新特性,感兴趣的小伙伴们可以参考一下2016-06-06

0c932a99bb7b6f23c937db507070cc7b.png

asp.net 图片超过指定大小后等比例压缩图片的方法,需要的朋友可以参考一下2013-05-05

cca732bf65a93ed2ec0ac80c638460fe.png

本文主要介绍了Asp .net 调用带参数的存储过程的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧2017-03-03

2d9f31f2af7b675a3d153d2b7f1035a7.png

AJAX(Asynchronous JavaScript and XML)是一种进行页面局部异步刷新的技术。用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在页面中使用Js创建XMLHTTPRequest对象来向服务器发出请求以及获得返回的数据。2014-11-11

b452cee8ec5cd9e58ab98eba17281e59.png

.net真是方便,这几天帮朋友写了个小软件,用它还真感觉轻松自在,很称手,自带的类库既丰富又实用2008-10-10

f4838ec7e2d4da28e0b57d4e852dadd4.png

网上的cms系统好多都是支持生成静态的,大家在使用过程中,也肯定遇到了很多的问题,下面就是一些实现的原理,其实 asp,php,asp.net的原理都是差不多的。2009-06-06

最新评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值