推荐C#开发桌面自动更新程序(服务端与客户端)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文以小型应用的通用性自动更新程序,开发的程序可以直接拿过来使用,非常方便。

原理

服务器端的结构是这样的:

其工作原理如下:

Update.asmx仅提供一个功能,就是检测是否需要更新,在需要更新的时候就返回一个更新地址,通常情况下返回的地址就是Download.ashx,而在某些特殊情况下,也可以修改服务端使之从其他Url提供更新下载。检测是否需要更新的的具体做法是:首先获取Updata目录中的主程序版本号,再获取数据库中的最新版本号,两者对比。如果相同则直接与客户端提供的版本号相对比并返回结果;如果不同则将主程序版本号写入数据库,然后生成新的更新文件包,直接向客户端返回更新地址。

Download.ashx的功能仅仅是将最新版本更新文件包输出。

而客户端部分包含主程序、Update.exe以及其他附属文件,更新时由主程序检测并下载更新,在主程序退出时,如有更新并已成功下载,则调用Update.exe完成解包及更新覆盖工作。需注意的是:Update.exe永远不能被更新,因为它无法更新其自身,所以服务端更新时也不要将Update.exe纳入更新包。

下面就是来实际编写一个自动更新解决方案:

服务器端

首先建立一个Web服务项目,项目名为“自动更新服务”:

添加一数据库,名为Database.mdf:

在数据库中创建新的数据库关系图,并如下设计数据库表:

创建一个 Entity Data Model,名为Model.edmx:

从刚才的建立的数据库中生成模型:

在Web.Config的appSettings节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址:

引入一个GZip类用以打包(该类的源码将在文章末尾随本文示例源代码一并提供):

添加一个新的Web服务,名为Update.asmx:

书写如下代码:

[WebMethod]

public string GetUpdate(string ClientVerison)

{

if (获取最新版本() != ClientVerison)

{

return System.Web.Configuration.WebConfigurationManager.AppSettings["更新包下载地址"];

}

return null;

}

static string 获取最新版本()

{

string v = 获取文件版本(HttpContext.Current.Server.MapPath(string.Format("~/App_Data/Update/{0}",

System.Web.Configuration.WebConfigurationManager.AppSettings["主程序文件名"])));

using (var c = new DatabaseEntities())

{

//从数据库取得最新版本信息

var q = c.UpdateV ersion.OrderByDescending(f => f.PublicTime).FirstOrDefault();

if (q == null || v != q.Version)

{

//数据库中的版本与当前主程序版本不一致时,以主程序版本为准,写入数据库,并生成新的更新文件包

var d = new UpdateVersion() { Version = v, PublicTime = DateTime.Now };

c.AddToUpdateVersion(d);

c.SaveChanges();

打包更新文件(HttpContext.Current.Server.MapPath("~/App_Data/Update/"), HttpContext.Current.Server.MapPath("~/App_Data/Update.gzip"));

}

}

return v;

}

public static void 打包更新文件(string 打包目录, string 输出文件)

{

GZip.压缩(输出文件, Directory.GetFiles(打包目录).Concat(Directory.GetDirectories(打包目录)).ToArray());

}

public static string 获取文件版本(string 文件路径)

{

FileVersionInfo f = FileVersionInfo.GetVersionInfo(文件路径);

return f.FileVersion;

}创建Download.ashx,用以输出更新文件包:

代码:

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "application/zip";

context.Response.WriteFile(context.Server.MapPath("~/App_Data/Update.gzip"));

}

服务端至此就编写完毕了。

客户端

新建一个WinForm应用程序项目,名为Update:

建好之后直接删掉Form1.cs吧,此程序不需要界面,在Program.cs中写代码就可以了。同样需要引入GZip类用于解包:

然后编写代码:

[STA Thread]

static void Main()

{

try

{

var d = DateTime.Now;

while (DateTime.Now.Subtract(d).TotalSeconds < 10) Application.DoEvents();

相关文档
最新文档