Update.asmx仅提供一个功能,就是检测是否需要更新,在需要更新的时候就返回一个更新地址,通常情况下返回的地址就是Download.ashx,而在某些特殊情况下,也可以修改服务端使之从其他Url提供更新下载。检测是否需要更新的的具体做法是:首先获取Updata目录中的主程序版本号,再获取数据库中的最新版本号,两者对比。如果相同则直接与客户端提供的版本号相对比并返回结果;如果不同则将主程序版本号写入数据库,然后生成新的更新文件包,直接向客户端返回更新地址。
Download.ashx的功能仅仅是将最新版本更新文件包输出。
而客户端部分包含主程序、Update.exe以及其他附属文件,更新时由主程序检测并下载更新,在主程序退出时,如有更新并已成功下载,则调用Update.exe完成解包及更新覆盖工作。需注意的是:Update.exe永远不能被更新,因为它无法更新其自身,所以服务端更新时也不要将Update.exe纳入更新包。
下面就是来实际编写一个自动更新解决方案:
服务器端
首先建立一个Web服务项目,项目名为“自动更新服务”:
添加一数据库,名为Database.mdf:
在数据库中创建新的数据库关系图,并如下设计数据库表:
创建一个Ado.Net Entity Data Model,名为Model.edmx:
从刚才的建立的数据库中生成模型:
在Web.Config的appSettings节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址:
C# code复制代码
<appSettings>
<add key="主程序文件名" value="MyApp.exe"/>
<add key="更新包下载地址" value="Download.ashx"/>
</appSettings>
引入一个GZip类用以打包(该类的源码将在文章末尾随本文示例源代码一并提供):
添加一个新的Web服务,名为Update.asmx:
书写如下代码:
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 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,用以输出更新文件包:
代码:
C# code复制代码
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类用于解包:
然后编写代码:
C# code复制代码
[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:
为程序添加服务引用:
这里的地址使用的是本地的调试地址。
为了检测主程序自身的版本号,还需要添加对System.Windows.Forms的引用。
然后开始设计界面,这里仅为演示更新操作,所以界面上只是简单的设计了更新相关的提示、操作控件:
代码为:
<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",我们将会在需要时再将其显示出来。
编写后台代码:
C# code复制代码
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”:
然后启动客户端程序进行测试,应该看到程序界面里什么都没有,因为客户端和服务器端程序版本是一致的。
现在我们修改客户端版本号为1.0.0.1:
然后重新编译程序。
因为服务器仅仅是判断版本号是否不同,而不是哪个更高,所以不仅仅是升级,降级更新也是可以的,我们来测试一下:
找到所谓的新版本了^^,点开始下载:
下载完成,这时目录里就有update.data这个文件了。
现在关闭程序,等待10秒,让Update.exe完成更新:
可以看到,程序被降级为1.0.0.0了,而且那个“更新说明.txt”也被更新出来了。
分享到:
相关推荐
根据提供的文件信息,本文将详细解析如何利用C#语言实现在线软件自动升级程序,并通过具体的代码实例来展示这一过程。 ### C#实现在线软件自动升级程序 #### 一、架构设计与需求分析 在开发一个在线软件自动升级...
WPF软件自动更新程序,任何C#程序都可以引用此程序来实现软件的版本检查及自动更新,使用介绍:https://blog.csdn.net/u011373615/article/details/133940461
本文介绍了使用 C# 实现软件自动更新程序的关键步骤,包括使用 XML 配置文件来存储升级信息,获取客户端应用程序及服务器端升级程序的最近一次更新日期,比较日期来检测是否需要下载升级版本。通过这些步骤,我们...
在本文中,我们将深入探讨如何使用C# WinForm来实现一个自动升级程序,这将对所有基于WinForm的客户端应用程序非常有用。这个程序的核心目的是帮助用户无缝地更新他们的应用程序到最新版本,从而确保他们始终拥有...
第三,作者详细介绍了使用C#语言实现在线升级的关键步骤,包括准备XML配置文件、获取客户端应用程序及服务器端升级程序的最近一次更新日期、比较新旧版本、下载更新、删除旧的主程序、拷贝新的主程序、启动新的主...
本示例("C#程序自动更新")探讨了如何在C#应用程序中实现一个简单的自动更新功能。 首先,我们要理解自动更新的基本流程。这个过程通常包括以下几个步骤: 1. **检查更新**:应用程序启动时或用户触发时,程序会...
在软件开发领域,自动升级功能是一项重要的特性,它允许用户无缝地更新应用程序到最新版本,无需手动下载安装包。本文将深入探讨如何使用C#语言实现这一功能,以确保您的软件始终保持最新状态。 首先,自动升级的...
【C#实现软件自动更新和升级发布】 在软件开发中,自动更新功能是提高用户体验、确保用户始终使用最新版本的重要手段。使用C#语言来实现这一功能,可以使开发者更便捷地管理和分发软件更新,避免用户手动下载和安装...
本篇将深入探讨基于C#和XML实现的软件自动升级程序,以及如何利用如`CSharpZipLib.dll`这样的库来处理压缩文件。 首先,C#是一种面向对象的编程语言,广泛应用于Windows应用开发,尤其是在.NET Framework或.NET ...
本主题聚焦于"C#程序自动远程更新"这一重要技术,它允许应用程序在运行时检查并安装远程服务器上的最新版本,从而确保用户始终使用的是最新的软件功能,并解决了安全性和错误修复的问题。 一、自动更新机制 自动...
在C#中实现软件自动升级是一项常见的任务,它涉及到客户端应用程序与服务器之间的通信,以及对新版本的检测、下载和安装。以下是一些关键的知识点和步骤,它们可以帮助你理解和实现这一功能。 首先,理解软件自动...
程序分成UpdateServer(Web服务应用程序)和一个Client(命令行程序)。UpdateServer提供应用程序的最新版本,应用程序存放在UpdateServer下的AppCenter目录中。Client程序运行时,先从UpdateServer下载最新的版本,...
在C/S(客户端/服务器)模式下,软件自动在线升级是一项关键功能,它允许应用程序能够自动检查并安装最新的更新,从而提高用户体验并确保系统的安全性。本篇将详细讲解如何使用C#来实现这一功能,同时利用XML作为...
本文将深入讲解如何使用C# WinFrom客户端结合WebService实现自动更新升级的功能。 首先,我们要理解C# WinFrom客户端。C#是一种面向对象的编程语言,广泛应用于Windows桌面应用开发,WinForm则是C#中的用户界面框架...
总的来说,"C#-项目通用自动升级程序-源代码"是一个实用的工具,不仅能够帮助开发者快速集成自动升级功能,还为初学者提供了深入理解C#编程和软件更新机制的学习材料。通过实践这个项目,开发者可以掌握一套完整的...
总的来说,C# WinForm 自动升级程序V1.0是一个实现软件自动更新的工具,它通过检查、下载、安装和重启等步骤,确保用户能够方便地获取并安装应用的最新版本,提升软件的稳定性和可用性。对于开发者来说,理解和掌握...
【采用C#实现软件自动更新的方法】 在C#编程中,软件自动更新是解决C/S架构应用程序维护性和升级便利性问题的重要技术。由于C/S结构的程序在维护、部署和升级方面存在诸多挑战,开发者们一直在寻找解决方案。本文将...
在IT行业中,自动升级程序是软件开发不可或缺的一部分,它确保用户能够轻松地获取软件的最新更新,提升用户体验并...通过阅读和分析这些文件,开发者可以学习到如何结合上述知识点来实现一个功能完备的C#自动升级程序。