天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

簡(jiǎn)單的自動(dòng)更新程序?qū)崿F(xiàn)

image 本文將演示一種桌面程序自動(dòng)更新方案,其步驟比較多,但原理非常簡(jiǎn)單,通用性尚可,對(duì)于小型應(yīng)用來(lái)說(shuō),直接拿去就可以用了。

原理

服務(wù)器端的結(jié)構(gòu)是這樣的:

image

其工作原理如下:

Update.asmx僅提供一個(gè)功能,就是檢測(cè)是否需要更新,在需要更新的時(shí)候就返回一個(gè)更新地址,通常情況下返回的地址就是Download.ashx,而在某些特殊情況下,也可以修改服務(wù)端使之從其他Url提供更新下載。檢測(cè)是否需要更新的的具體做法是:首先獲取Updata目錄中的主程序版本號(hào),再獲取數(shù)據(jù)庫(kù)中的最新版本號(hào),兩者對(duì)比。如果相同則直接與客戶(hù)端提供的版本號(hào)相對(duì)比并返回結(jié)果;如果不同則將主程序版本號(hào)寫(xiě)入數(shù)據(jù)庫(kù),然后生成新的更新文件包,直接向客戶(hù)端返回更新地址。

Download.ashx的功能僅僅是將最新版本更新文件包輸出。

而客戶(hù)端部分包含主程序、Update.exe以及其他附屬文件,更新時(shí)由主程序檢測(cè)并下載更新,在主程序退出時(shí),如有更新并已成功下載,則調(diào)用Update.exe完成解包及更新覆蓋工作。需注意的是:Update.exe永遠(yuǎn)不能被更新,因?yàn)樗鼰o(wú)法更新其自身,所以服務(wù)端更新時(shí)也不要將Update.exe納入更新包。

下面就是來(lái)實(shí)際編寫(xiě)一個(gè)自動(dòng)更新解決方案:

服務(wù)器

首先建立一個(gè)Web服務(wù)項(xiàng)目,項(xiàng)目名為“自動(dòng)更新服務(wù)”:

image

添加一數(shù)據(jù)庫(kù),名為Database.mdf:

image

在數(shù)據(jù)庫(kù)中創(chuàng)建新的數(shù)據(jù)庫(kù)關(guān)系圖,并如下設(shè)計(jì)數(shù)據(jù)庫(kù)表:

image

創(chuàng)建一個(gè)Ado.NET Entity Data Model,名為Model.edmx:

image

從剛才的建立的數(shù)據(jù)庫(kù)中生成模型:

image

在Web.Config的appSettings節(jié)點(diǎn)中新增兩個(gè)節(jié)點(diǎn),用以設(shè)置更新程序的主文件名及更新包下載地址:

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

引入一個(gè)GZip類(lèi)用以打包(該類(lèi)的源碼將在文章末尾隨本文示例源代碼一并提供):

image

添加一個(gè)新的Web服務(wù),名為Update.asmx:

image

書(shū)寫(xiě)如下代碼:

[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/Up
date/{0}"
, System.Web.Configuration.WebConfigurationManager.AppSettings["主程序文件名"]))); using (var c = new DatabaseEntities()) { //從數(shù)據(jù)庫(kù)取得最新版本信息 var q = c.UpdateVersion.OrderByDescending(f => f.PublicTime).FirstOrDefault(); if (q == null || v != q.Version) { //數(shù)據(jù)庫(kù)中的版本與當(dāng)前主程序版本不一致時(shí),以主程序版本為準(zhǔn),寫(xiě)入數(shù)據(jù)庫(kù),并生成新的更新文件包 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;}

創(chuàng)建Download.ashx,用以輸出更新文件包:

image

代碼:

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

服務(wù)端至此就編寫(xiě)完畢了。

客戶(hù)端

新建一個(gè)WinForm應(yīng)用程序項(xiàng)目,名為Update:

image

建好之后直接刪掉Form1.cs吧,此程序不需要界面,在Program.cs中寫(xiě)代碼就可以了。

同樣需要引入GZip類(lèi)用于解包:

image

然后編寫(xiě)代碼:

[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文件,覆蓋到當(dāng)前目錄中。

現(xiàn)在來(lái)建立主程序,主程序是WinForm、命令行、WPF都可以,我們新建一個(gè)WPF應(yīng)用程序,命名為MyAPP:

image

為程序添加服務(wù)引用:

image

這里的地址使用的是本地的調(diào)試地址。

為了檢測(cè)主程序自身的版本號(hào),還需要添加對(duì)System.Windows.Forms的引用。

然后開(kāi)始設(shè)計(jì)界面,這里僅為演示更新操作,所以界面上只是簡(jiǎn)單的設(shè)計(jì)了更新相關(guān)的提示、操作控件:

image

代碼為:

 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">            Height="1*" />            Height="1*" />            Height="1*" />                        

需注意的是,這里控件都被設(shè)置為Visibility="Hidden",我們將會(huì)在需要時(shí)再將其顯示出來(lái)。

編寫(xiě)后臺(tái)代碼:

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))    {        //獲取相對(duì)于Web服務(wù)所在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"
)); }}

 

測(cè)試

現(xiàn)在將主程序、附屬文件和Update.exe放在一起,并將主程序及附屬文件復(fù)制一份放到服務(wù)器端的App_data/Update/目錄中,再添加一個(gè)“更新說(shuō)明.txt”:

image

然后啟動(dòng)客戶(hù)端程序進(jìn)行測(cè)試,應(yīng)該看到程序界面里什么都沒(méi)有,因?yàn)榭蛻?hù)端和服務(wù)器端程序版本是一致的。

現(xiàn)在我們修改客戶(hù)端版本號(hào)為1.0.0.1:

image

然后重新編譯程序。

因?yàn)?a href=/yuedu/fuwuqi/ target=_blank class=infotextkey>服務(wù)器僅僅是判斷版本號(hào)是否不同,而不是哪個(gè)更高,所以不僅僅是升級(jí),降級(jí)更新也是可以的,我們來(lái)測(cè)試一下:

image

找到所謂的新版本了^^,點(diǎn)開(kāi)始下載:

image

下載完成,這時(shí)目錄里就有update.data這個(gè)文件了。

現(xiàn)在關(guān)閉程序,等待10秒,讓Update.exe完成更新:

image

可以看到,程序被降級(jí)為1.0.0.0了,而且那個(gè)“更新說(shuō)明.txt”也被更新出來(lái)了。

下載

示例源代碼:http://www.uushare.com/user/icesee/file/2338431

本文的XPS版本:http://www.uushare.com/user/icesee/file/2338436

NET技術(shù)簡(jiǎn)單的自動(dòng)更新程序?qū)崿F(xiàn),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 色拍拍噜噜噜啦啦新网站 | 狠狠干狠狠色 | 亚洲精品国偷拍电影自产在线 | 国产精品久久久久久久A片冻果 | 国产福利视频在线观看福利 | 久久国产免费 | 亚洲AV成人片色在线观看网站 | 亚洲综合AV色婷婷五月蜜臀 | 国产曰韩无码亚洲视频 | 日本最新在线不卡免费视频 | 久久久久国产 | 亚洲最大日夜无码中文字幕 | 99久久精品费精品蜜臀AV | 暖暖免费观看日本在线视频 | 超碰视频97av | 伊人久久久久久久久香港 | 久久久精品久久 | 免费99精品国产自在现线 | 一级做a爰片久久毛片潮喷动漫 | 欧美性猛交AAA片免费观看 | 夜夜精品视频一区二区 | 黄小飞二人转 | 成人毛片大全 | 亚洲中文字幕欧美自拍一区 | 大桥未久电影在线 | 99久久国产露脸精品国产麻豆 | 国产 有码 无码 电影 | 在线播放毛片 | 色婷婷亚洲精品天天综合影院 | 亚洲午夜久久久久久久久电影网 | 亚洲国产成人精品无码区APP | 影音先锋电影资源av | 色男人的天堂久久综合 | 久久成人精品免费播放 | 伊人久久丁香色婷婷啪啪 | 九九热最新视频 | 特级毛片内射WWW无码 | 韩国和日本免费不卡在线 | 青青在线视版在线播放 | 草莓在线观看 | 國産麻豆AVMDMD0179 |