- 浏览: 117885 次
- 性别:
- 来自: 长沙
最新评论
-
leecyz:
不可分页全选
脚本实现全选GridView中的CheckBox -
agameplay:
呵呵,感谢,一直不知道会员定期过期检测,这下有法了,以前以为T ...
net中的定时器 -
raisun_1988:
yining159 写道这个跟.net有什么关系。。。
web ...
asp.net 页面弹出层,背景变灰不能操作 -
yining159:
这个跟.net有什么关系。。。
asp.net 页面弹出层,背景变灰不能操作 -
wm1688:
very good需要说明一下的是 在mymetadata文件 ...
Myeclipse中复制项目的注意事项
本文将演示一种桌面程序自动更新方案,其步骤比较多,但原理非常简单,通用性尚可,对于小型应用来说,直接拿去就可以用了。
原理
服务器端的结构是这样的: 其工作原理如下: 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节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址: <appSettings> <add key="主程序文件名" value="MyApp.exe"/> <add key="更新包下载地址" value="Download.ashx"/> </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.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,用以输出更新文件包: 代码: 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类用于解包: 然后编写代码: [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",我们将会在需要时再将其显示出来。
编写后台代码: 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完成更新: |
评论
是啊,旗舰版的。
发表评论
-
脚本实现全选GridView中的CheckBox
2010-11-16 16:36 1175今天终于实现了全选CheckBox而不用AJAX或者回传事件, ... -
net中的定时器
2010-11-09 10:57 882在web中某个类中对某个方法我想让它定时执行。 对于此,我们 ... -
Visual Studio 最常用的13个快捷键
2010-11-09 09:30 9091. F5:启动调试 2. F7 /Shif ... -
Javascript写入Html
2010-11-06 09:31 979一:打开新的窗口,并向其中写入html代码 1 var ... -
没有源码时,添加网站功能
2010-09-29 14:11 805有的时候想要在编译成DLL的网站上添加一个功能,又需要访问数据 ... -
asp.net代码中尖括号和百分号的含义
2010-09-28 11:41 1653asp.net代码中尖括号和百分号的含义 在.aspx ... -
SQL对象名无效的解决
2010-09-03 17:29 1636SQL对象名无效的解决方法 http://www.itpob. ... -
.net 获取url的方法
2010-08-24 14:33 1012测试的url地址是http://www.gkxsn.com/t ... -
asp.net返回上一个页面
2010-08-24 14:30 923//首先要获取URL,如下所示: private strin ... -
ASP.NET中突破上传4M文件的限制
2010-08-17 09:26 871http://www.itpob.cn ... -
使用IIS内置压缩功能,增加网站访问速度
2010-08-16 20:35 1017【网上购物论坛】-IT泡吧![Www.itpob.Cn]网上购 ... -
过滤HTML标签
2010-08-13 09:27 982[www.itpob.cn] http://www.itpob ... -
VS2008+SQL2005 开发环境搭建
2010-08-04 14:09 1627【网上购物论坛】-IT泡吧![Www.itpob.Cn]网 ... -
javascript获取本页面URL地址
2010-08-03 15:09 821【网上购物论坛】-IT泡 ... -
无限级分类设计--纯数据库实现
2010-08-03 10:13 1040【网上购物论坛】-IT泡吧![Www.itpob.Cn]网上 ... -
WEB第三方打印控件[ASP.NET常用工具]
2010-08-03 10:04 3113【网上购物论坛】-IT泡吧![Www.itpob. ... -
虚拟主机上用Asp.net实现Urlrewrite
2010-07-23 10:44 802【网上购物论坛】-IT泡吧![Www.itpob.Cn ... -
asp.net实现返回上一页的6种方法
2010-07-23 10:32 733【网上购物论坛】-IT泡吧![Www.itpob.Cn]网上 ... -
ASP.NET文件下载函数使用浅析
2010-07-23 10:22 714【网上购物论坛】-IT泡吧![Www.itpob.Cn ... -
教你在asp.net中动态变更CSS
2010-07-23 10:18 768【网上购物论坛】-IT泡吧![Www.itpob.Cn]网上购 ...
相关推荐
本示例("C#程序自动更新")探讨了如何在C#应用程序中实现一个简单的自动更新功能。 首先,我们要理解自动更新的基本流程。这个过程通常包括以下几个步骤: 1. **检查更新**:应用程序启动时或用户触发时,程序会...
综上所述,这个"简单的自动更新程序.rar"包含了编写和实现自动更新功能所需的各种组件,包括与服务器通信的逻辑、用户界面、配置管理和状态跟踪等。它提供了一种自动化的方式,使软件能够检测并应用新版本,从而减轻...
【自动关机程序实现】 自动关机程序是一种实用工具,允许用户设置一个特定的时间,让计算机在指定时间后自动关闭。这种程序可以基于多种编程语言实现,如Java和C++。下面我们将详细讨论如何使用C#来创建一个带有...
本教程将介绍如何使用C# VS2008来实现一个简单的自动更新程序,确保用户能够轻松地获取并安装最新的应用程序版本。 自动更新程序的核心功能是检测当前应用程序版本与服务器上最新版本之间的差异,并在有新版本可用...
本主题将深入探讨如何使用C++实现一个自动更新系统,让软件能够检测并安装服务器上的新版本。 首先,我们需要理解自动更新的核心流程: 1. **版本检查**:在用户启动软件时,程序应检查当前版本与服务器上可用的...
在C#编程环境中,开发一个程序自动更新的功能是一项常见的任务,尤其对于持续迭代和改进的软件产品来说至关重要。本文将详细讲解如何利用C#来创建一个简单易用的程序更新器,以确保用户始终能够获得最新的软件版本。...
vc++简单的软件自动升级程序源代码 vc++简单的软件自动升级程序源代码,提供软件在线自动升级功能,除了自动升级功能外,本程序还用到了一些常用的窗体修饰类,这些类可以方便应用到你的软件项目中,比如阴影效果...
本主题将深入探讨如何使用C# WPF来实现一个简单的自动更新功能,这对于保持智能客户端应用的最新状态至关重要。智能客户端通常指的是能够自我更新、具有离线功能并且能够提供丰富的用户体验的应用程序。 首先,我们...
"vc 自动升级_更新 VC_自动更新程序"这部分标签说明了这个程序的核心功能是实现VC++软件的自动更新。 【描述】中提到这是一个“自动更新程序的可执行文件”,意味着它能够检测并安装软件的最新版本,确保用户始终...
VB(Visual Basic)自动更新程序源代码是一种用于创建应用程序自我更新功能的技术,它允许软件在检测到新版本时自动下载并安装更新。这样的系统对于确保用户始终运行的是最新、最安全的软件版本至关重要。以下是对VB...
- **ClickOnce部署**:这是.NET Framework提供的一种简单自动更新方案,但可能会限制自定义需求。 - **自定义安装逻辑**:对于更复杂的需求,可以编写自己的安装逻辑,例如创建安装包、使用安装向导等。 在实际...
本项目名为"通用自动更新程序(源码)",主要使用C#编程语言,并结合WinForm界面设计,为用户提供了一种简单易用的方式来实现程序的自动更新。 首先,C#是一种面向对象的编程语言,由微软公司开发,广泛应用于...
在IT行业中,软件自动更新是一项重要的技术,它使得应用程序能够实时获取最新的功能、修复和安全...这种方式虽然相对简单,但对于小型应用或个人项目来说,能有效实现软件的自动更新,提高用户体验并确保软件的安全性。
总的来说,"Android 自动 更新 程序"提供了一套完整的解决方案,包括了aar库、简单的配置方式以及可能的自定义Application类,帮助开发者轻松实现应用的自动更新功能。这不仅可以确保应用始终保持最新状态,还能减少...
在C#编程中,实现程序自动更新是一项重要的功能,它能确保用户总是运行最新版本的软件,从而提高软件的稳定性和安全性。本教程将详细讲解如何在C#中设计一个简单而实用的自动更新机制,特别关注如何处理英文命名的...
“简单明了,对初学者有很大的帮助”表明这个程序的设计思路清晰,代码结构良好,适合初学者学习和理解自动更新的实现原理。初学者可以通过阅读和分析代码,了解如何在MFC环境中处理网络请求、解析版本信息、管理...
通过这种方式,Winform 应用程序也可以实现自动更新的功能,极大地提高了软件维护的效率和用户体验。 总之,软件自动更新机制是现代软件开发中不可或缺的一部分,它不仅简化了软件维护的过程,还提升了用户的满意度...
在IT行业中,自动更新程序是软件开发不可或缺的一部分,它确保用户能够及时获得最新的软件功能、安全修复和性能改进。本文将深入探讨如何使用C#语言创建一个自动更新系统,包括程序的自动压缩和备份功能。 首先,让...
标题中的“通用程序自动更新程序”指的是这样一种系统,它可以被集成到各种不同的应用程序中,无需特定的编程语言或平台限制,从而实现软件的无缝和便捷更新。 描述中提到,这个程序设计得直观易懂,用户可以将其...
在IT领域,应用程序自动更新是现代软件开发中的一个重要组成部分,它极大地提高了用户使用软件的便捷性和安全性。自动更新工具能够确保应用程序始终运行在最新版本,从而获取最新的功能、修复、安全补丁,以及性能...