日期:2014-05-17  浏览次数:20813 次

C# 实现软件自动更新升级程序

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

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

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

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

服务器端

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

image

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

image

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

image

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

image

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

image

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

C# code复制代码
<appSettings>
    <add key="主程序文件名" value="MyApp.exe"/>
    <add key="更新包下载地址" value="Download.ashx"/>
</appSettings>

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

image

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

image

书写如下代码:

C# code复制代码
[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.UpdateVersion.OrderByDescending(f => f.PublicTime).FirstOrDefault();
        if (q == null || v != q.Version)
        {
            //数据库中的版本与当前主程序版本不一致时,以主程序版本为准,写入数据库,并生成新的更新文件包
            var