`
raisun_1988
  • 浏览: 117931 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

简单的自动更新程序实现

    博客分类:
  • .Net
 
阅读更多

image 本文将演示一种桌面程序自动更新方案,其步骤比较多,但原理非常简单,通用性尚可,对于小型应用来说,直接拿去就可以用了。

 

 

原理

 

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

image

其工作原理如下:

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节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址:

<appSettings>
    <add key="主程序文件名" value="MyApp.exe"/>
    <add key="更新包下载地址" value="Download.ashx"/>
</appSettings>

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

image

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

image

书写如下代码:

[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 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,用以输出更新文件包:

image

代码:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "application/zip";
    context.Response.WriteFile(context.Server.MapPath("~/App_Data/Update.gzip"));
}

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

 

客户端

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

image

建好之后直接删掉Form1.cs吧,此程序不需要界面,在Program.cs中写代码就可以了。

 

同样需要引入GZip类用于解包:

image

然后编写代码:

[STAThread]
static void Main()
{
    try
    {
        var d = DateTime.Now;
        while (DateTime.Now.Subtract(d).TotalSeconds < 10) Application.DoEvents();
        GZip.解压缩(Path.Combine(Application.StartupPath, "update.data"), Application.StartupPath);
    }
    catch { }
}

这里的作用就是等待10秒,然后解包update.data文件,覆盖到当前目录中。

现在来建立主程序,主程序是WinForm、命令行、WPF都可以,我们新建一个WPF应用程序,命名为MyAPP:

image

为程序添加服务引用:

image

这里的地址使用的是本地的调试地址。

为了检测主程序自身的版本号,还需要添加对System.Windows.Forms的引用。

然后开始设计界面,这里仅为演示更新操作,所以界面上只是简单的设计了更新相关的提示、操作控件:

image

代码为:

<Window x:Class="MyApp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="377" Loaded="Window_Loaded" Closed="Window_Closed">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <Label Margin="0" Name="label1" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden">检测到新版本,是否下载?</Label>
        <Button Grid.Row="1" Height="23" Name="button1" VerticalAlignment="Center" Visibility="Hidden" Click="button1_Click">开始下载</Button>
        <Label Grid.Row="2" Margin="0" Name="label2" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="Hidden">更新包已下载完毕,在程序关闭后将自动执行更新操作。</Label>
    </Grid>
</Window>

需注意的是,这里控件都被设置为Visibility="Hidden",我们将会在需要时再将其显示出来。

 

编写后台代码:

public Uri DownloadUri
{
    get
    {
        return _DownloadUri;
    }
    set
    {
        _DownloadUri = value;
    }
}
private Uri _DownloadUri;

public bool UpdateReady
{
    get
    {
        return _UpdateReady;
    }
    set
    {
        _UpdateReady = value;
    }
}
private bool _UpdateReady;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var u = new MyApp.ServiceReference.UpdateSoapClient();
    var s=u.GetUpdate(System.Windows.Forms.Application.ProductVersion);
    if (!string.IsNullOrEmpty(s))
    {
        //获取相对于Web服务所在Uri的Uri
        DownloadUri = new Uri(u.Endpoint.ListenUri, s);
        label1.Visibility = button1.Visibility = Visibility.Visible;
    }
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    var c = new WebClient();
    c.DownloadFile(DownloadUri, System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "update.data"));
    UpdateReady = true;
    label2.Visibility = Visibility.Visible;
}

private void Window_Closed(object sender, EventArgs e)
{
    if (UpdateReady)
    {
        Process.Start(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "update.exe"));
    }
}

 

测试

现在将主程序、附属文件和Update.exe放在一起,并将主程序及附属文件复制一份放到服务器端的App_data/Update/目录中,再添加一个“更新说明.txt”:

image

然后启动客户端程序进行测试,应该看到程序界面里什么都没有,因为客户端和服务器端程序版本是一致的。

现在我们修改客户端版本号为1.0.0.1:

image

然后重新编译程序。

因为服务器仅仅是判断版本号是否不同,而不是哪个更高,所以不仅仅是升级,降级更新也是可以的,我们来测试一下:

image

找到所谓的新版本了^^,点开始下载:

image

下载完成,这时目录里就有update.data这个文件了。

 

 

 

现在关闭程序,等待10秒,让Update.exe完成更新:

image

欢迎加入:http://www.itpob.cn/bbs

 

分享到:
评论
6 楼 Ultraman84 2010-02-01  
这个东西早有了吧 微软叫smart client
5 楼 xuehaitao 2010-02-01  
这个方案不错。仔细研究了。
4 楼 dcdc723 2010-02-01  
方法不错,条理也相当清晰。。。收了。~~~~
3 楼 raisun_1988 2010-01-26  
ajonjun 写道
楼主用的是win7系统么。

是啊,旗舰版的。
2 楼 ajonjun 2010-01-26  
楼主用的是win7系统么。
1 楼 ajonjun 2010-01-26  
学习了,谢谢。。

相关推荐

    C#程序自动更新

    本示例("C#程序自动更新")探讨了如何在C#应用程序中实现一个简单的自动更新功能。 首先,我们要理解自动更新的基本流程。这个过程通常包括以下几个步骤: 1. **检查更新**:应用程序启动时或用户触发时,程序会...

    简单的自动更新程序.rar

    综上所述,这个"简单的自动更新程序.rar"包含了编写和实现自动更新功能所需的各种组件,包括与服务器通信的逻辑、用户界面、配置管理和状态跟踪等。它提供了一种自动化的方式,使软件能够检测并应用新版本,从而减轻...

    简单的实现自动关机程序代码

    【自动关机程序实现】 自动关机程序是一种实用工具,允许用户设置一个特定的时间,让计算机在指定时间后自动关闭。这种程序可以基于多种编程语言实现,如Java和C++。下面我们将详细讨论如何使用C#来创建一个带有...

    C#VS2008自动更新程序简单实现

    本教程将介绍如何使用C# VS2008来实现一个简单的自动更新程序,确保用户能够轻松地获取并安装最新的应用程序版本。 自动更新程序的核心功能是检测当前应用程序版本与服务器上最新版本之间的差异,并在有新版本可用...

    C++实现软件自动更新(update)

    本主题将深入探讨如何使用C++实现一个自动更新系统,让软件能够检测并安装服务器上的新版本。 首先,我们需要理解自动更新的核心流程: 1. **版本检查**:在用户启动软件时,程序应检查当前版本与服务器上可用的...

    C#开发程序自动更新,简单易用

    在C#编程环境中,开发一个程序自动更新的功能是一项常见的任务,尤其对于持续迭代和改进的软件产品来说至关重要。本文将详细讲解如何利用C#来创建一个简单易用的程序更新器,以确保用户始终能够获得最新的软件版本。...

    vc++ c++ 简单的软件自动升级程序源代码 在线自动升级功能 自动升级

    vc++简单的软件自动升级程序源代码 vc++简单的软件自动升级程序源代码,提供软件在线自动升级功能,除了自动升级功能外,本程序还用到了一些常用的窗体修饰类,这些类可以方便应用到你的软件项目中,比如阴影效果...

    C# WPF 实现简单的自动更新智能客户端

    本主题将深入探讨如何使用C# WPF来实现一个简单的自动更新功能,这对于保持智能客户端应用的最新状态至关重要。智能客户端通常指的是能够自我更新、具有离线功能并且能够提供丰富的用户体验的应用程序。 首先,我们...

    vc++简单的软件自动升级程序源代码.rar_mfc 自动更新_purplexw5_vc 自动升级_更新 VC_自动更新程序

    "vc 自动升级_更新 VC_自动更新程序"这部分标签说明了这个程序的核心功能是实现VC++软件的自动更新。 【描述】中提到这是一个“自动更新程序的可执行文件”,意味着它能够检测并安装软件的最新版本,确保用户始终...

    vb 自动更新 程序 源代码

    VB(Visual Basic)自动更新程序源代码是一种用于创建应用程序自我更新功能的技术,它允许软件在检测到新版本时自动下载并安装更新。这样的系统对于确保用户始终运行的是最新、最安全的软件版本至关重要。以下是对VB...

    c# winform 自动更新程序

    - **ClickOnce部署**:这是.NET Framework提供的一种简单自动更新方案,但可能会限制自定义需求。 - **自定义安装逻辑**:对于更复杂的需求,可以编写自己的安装逻辑,例如创建安装包、使用安装向导等。 在实际...

    通用自动更新程序(源码)

    本项目名为"通用自动更新程序(源码)",主要使用C#编程语言,并结合WinForm界面设计,为用户提供了一种简单易用的方式来实现程序的自动更新。 首先,C#是一种面向对象的编程语言,由微软公司开发,广泛应用于...

    软件自动更新/程序更新

    在IT行业中,软件自动更新是一项重要的技术,它使得应用程序能够实时获取最新的功能、修复和安全...这种方式虽然相对简单,但对于小型应用或个人项目来说,能有效实现软件的自动更新,提高用户体验并确保软件的安全性。

    Android 自动 更新 程序

    总的来说,"Android 自动 更新 程序"提供了一套完整的解决方案,包括了aar库、简单的配置方式以及可能的自定义Application类,帮助开发者轻松实现应用的自动更新功能。这不仅可以确保应用始终保持最新状态,还能减少...

    C# 程序自动更新,简单实用

    在C#编程中,实现程序自动更新是一项重要的功能,它能确保用户总是运行最新版本的软件,从而提高软件的稳定性和安全性。本教程将详细讲解如何在C#中设计一个简单而实用的自动更新机制,特别关注如何处理英文命名的...

    vs2008写的自动更新的程序

    “简单明了,对初学者有很大的帮助”表明这个程序的设计思路清晰,代码结构良好,适合初学者学习和理解自动更新的实现原理。初学者可以通过阅读和分析代码,了解如何在MFC环境中处理网络请求、解析版本信息、管理...

    软件自动更新原理

    通过这种方式,Winform 应用程序也可以实现自动更新的功能,极大地提高了软件维护的效率和用户体验。 总之,软件自动更新机制是现代软件开发中不可或缺的一部分,它不仅简化了软件维护的过程,还提升了用户的满意度...

    自动更新程序(C#) 含原有的程序自动压缩,备份,

    在IT行业中,自动更新程序是软件开发不可或缺的一部分,它确保用户能够及时获得最新的软件功能、安全修复和性能改进。本文将深入探讨如何使用C#语言创建一个自动更新系统,包括程序的自动压缩和备份功能。 首先,让...

    通用程序自动更新程序

    标题中的“通用程序自动更新程序”指的是这样一种系统,它可以被集成到各种不同的应用程序中,无需特定的编程语言或平台限制,从而实现软件的无缝和便捷更新。 描述中提到,这个程序设计得直观易懂,用户可以将其...

    应用程序自动更新

    在IT领域,应用程序自动更新是现代软件开发中的一个重要组成部分,它极大地提高了用户使用软件的便捷性和安全性。自动更新工具能够确保应用程序始终运行在最新版本,从而获取最新的功能、修复、安全补丁,以及性能...

Global site tag (gtag.js) - Google Analytics