采取C#完成軟件主動更新的辦法。本站提示廣大學習愛好者:(采取C#完成軟件主動更新的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是采取C#完成軟件主動更新的辦法正文
本文實例剖析了采取C#完成軟件主動更新的辦法,長短常適用的功效,值得進修和自創。詳細以下:
1.成績概述:
歷久以來,寬大法式員為究竟是應用Client/Server,照樣應用Browser/Server構造爭辯不休,在這些爭辯傍邊,C/S構造的法式可 保護性差,安排艱苦,進級不便利,保護本錢高就是一個相當主要的身分。有許多企業用戶就是由於這個緣由而廢棄應用C/S。但是當一個運用必需要應用C/S 構造能力很好的完成其功效的時刻,我們該若何處理客戶真個安排與主動進級成績?安排很簡略,只需點擊裝置法式便可,難的在於每當有新版本宣布時,可以或許完成 主動進級。如今好了,我們的目的很簡略,我們願望開辟一個與詳細運用有關的可以或許復用的主動進級體系。上面我為年夜家供給了一套可復用的用C#編寫的自 動進級體系。
2.完成軟件的主動進級存在的艱苦
第一,為了查找長途辦事器上的更新,運用法式必需有查詢收集的門路,這須要收集編程、簡略的運用法式與辦事器通信的協定。
第二是下載。下載看起來不須要斟酌聯網的成績,但要斟酌下載用戶要求的文件,和在沒有效戶贊成時下載年夜文件。友愛的主動更新運用法式將應用殘剩的帶寬下載更新。這聽起來簡略,但倒是一個技巧困難,榮幸的是曾經有懂得決辦法。
第三個斟酌身分是應用新版運用法式改換原運用法式的進程。這個成績比擬風趣,由於它請求代碼運轉時將本身從體系刪除,有多種方法可以完成該功效[5],本文法式重要經由過程比擬新舊版本的日期號來完成調換新版本運用法式的功效。
3.完成軟件主動在線進級的道理
寫兩個法式,一個是主法式;一個是進級法式;一切進級義務都由進級法式完成。
①.啟動進級法式,進級法式銜接到網站,下載新的主法式(固然還包含支撐的庫文件、XML設置裝備擺設文檔等)莅臨時文件夾;
②.進級法式獲得辦事器端XML設置裝備擺設文件中新版本法式的更新日期或版本號或文件年夜小;
③.進級法式獲得原有客戶端運用法式的比來一次更新日期或版本號或文件年夜小,二者停止比擬;假如發明進級法式的日期年夜於原有法式的最新日期,則提醒用戶 能否進級;或許是采取將現有版本與最新版本作比擬,發明最新的則提醒用戶能否進級;也有人用其它屬性如文件年夜小停止比擬,發明進級法式的文件年夜小年夜於舊版 本的法式的年夜小則提醒用戶進級。本文重要采取比擬新舊版本更新日期號來提醒用戶進級。
④.假如用戶選擇進級,則獲得下載文件列表,開端停止批量下載文檔;
⑤.進級法式檢測舊的主法式能否運動,若運動則封閉舊的主法式;
⑥.刪除舊的主法式,拷貝暫時文件夾中的文件到響應的地位;
⑦.檢討主法式的狀況,若狀況為運動的,則啟動新的主法式;
⑧.封閉進級法式,進級完成。
4.用C#完成在線進級的症結步調
這裡我重要應用日期信息來檢測能否須要下載進級版本。
①.預備一個XML設置裝備擺設文件
稱號為AutoUpdater.xml,感化是作為一個進級用的模板,顯示須要進級的信息。
稱號為AutoUpdater.xml,感化是作為一個進級用的模板,顯示須要進級的信息。
<?xml version="1.0"?> //xml版本號 <AutoUpdater> <URLAddres URL="http://192.168.198.113/vbroker/log/"/>//進級文件地點辦事器真個網址 <UpdateInfo> <UpdateTime Date = "2005-02-02"/> //進級文件的更新日期 <Version Num = "1.0.0.1"/> //進級文件的版本號 </UpdateInfo> <UpdateFileList> //進級文件列表 <UpdateFile FileName = "aa.txt"/> //共有三個文件需進級 <UpdateFile FileName = "VB40.rar"/> <UpdateFile FileName = "VB4-1.CAB"/> </UpdateFileList> <RestartApp> <ReStart Allow = "Yes"/> //許可從新啟動運用法式 <AppName Name = "TIMS.exe"/> //啟動的運用法式名 </RestartApp> </AutoUpdater>
//xml版本號
//進級文件地點辦事器真個網址
//進級文件的更新日期
//進級文件的版本號
//進級文件列表
//共有三個文件需進級
//許可從新啟動運用法式
//啟動的運用法式名
從以上XML文檔中可以得知進級文檔地點辦事器真個地址、進級文檔的更新日期、須要進級的文件列表,個中共有三個文件需進級:aa.txt、VB40.rar、VB4-1.CAB。和能否許可從新啟動運用法式和從新啟動的運用法式名。
②.獲得客戶端運用法式及辦事器端進級法式的比來一次更新日期
可經由過程GetTheLastUpdateTime()函數來完成。
private string GetTheLastUpdateTime(string Dir)
{
string LastUpdateTime = "";
string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml";
if(!File.Exists(AutoUpdaterFileName))
return LastUpdateTime;
//翻開xml文件
FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open);
//xml文件浏覽器
XmlTextReader xml = new XmlTextReader(myFile);
while(xml.Read())
{
if(xml.Name == "UpdateTime")
{
//獲得進級文檔的最初一次更新日期
LastUpdateTime = xml.GetAttribute("Date");
break;
}
}
xml.Close();
myFile.Close();
return LastUpdateTime;
}
經由過程XmlTextReader翻開XML文檔,讀取更新時光從而獲得Date對應的值,即辦事器端進級文件的比來一次更新時光。
函數挪用完成:
//獲得客戶端指定途徑下的運用法式比來一次更新時光 string thePreUpdateDate = GetTheLastUpdateTime(Application.StartupPath); Application.StartupPath指客戶端運用法式地點的途徑。 //取得從辦事器端已下載文檔的比來一次更新日期 string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName); theFolder.FullName指在進級文檔下載到客戶機上的暫時文件夾地點的途徑。
③.比擬日期
客戶端運用法式比來一次更新日期與辦事器端進級法式的比來一次更新日期停止比擬。
//取得已下載文檔的比來一次更新日期
string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);
if(thePreUpdateDate != "")
{
//假如客戶端將進級的運用法式的更新日期年夜於辦事器端進級的運用法式的更新日期
if(Convert.ToDateTime(thePreUpdateDate)>=Convert.ToDateTime(theLastsUpdateDate))
{
MessageBox.Show("以後軟件曾經是最新的,無需更新!","體系提醒",MessageBoxButtons.OK,MessageBoxIcon.Information);
this.Close();
}
}
this.labDownFile.Text = "下載更新文件";
this.labFileName.Refresh();
this.btnCancel.Enabled = true;
this.progressBar.Position = 0;
this.progressBarTotal.Position = 0;
this.progressBarTotal.Refresh();
this.progressBar.Refresh();
//經由過程靜態數組獲得下載文件的列表
ArrayList List = GetDownFileList(GetTheUpdateURL(),theFolder.FullName);
string[] urls = new string[List.Count];
List.CopyTo(urls, 0);
將客戶端進級的運用法式的日期與辦事器端下載的運用法式日期停止比擬,假如前者年夜於後者,則不更新;假如前者小於後者,則經由過程靜態數組獲得下載文件的列表,開端下載文件。
經由過程BatchDownload()函數來完成。進級法式檢測舊的主法式能否運動,若運動則封閉舊的主法式;刪除舊的主法式,拷貝暫時文件夾中的文件到響應的地位;檢討主法式的狀況,若狀況為運動的,則啟動新的主法式。
private void BatchDownload(object data)
{
this.Invoke(this.activeStateChanger, new object[]{true, false});
try
{
DownloadInstructions instructions = (DownloadInstructions) data;
//批量下載
using(BatchDownloader bDL = new BatchDownloader())
{
bDL.CurrentProgressChanged += new DownloadProgressHandler(this.SingleProgressChanged);
bDL.StateChanged += new DownloadProgressHandler(this.StateChanged);
bDL.FileChanged += new DownloadProgressHandler(bDL_FileChanged);
bDL.TotalProgressChanged += new DownloadProgressHandler(bDL_TotalProgressChanged);
bDL.Download(instructions.URLs, instructions.Destination, (ManualResetEvent) this.cancelEvent);
}
}
catch(Exception ex)
{
ShowErrorMessage(ex);
}
this.Invoke(this.activeStateChanger, new object[]{false, false});
this.labFileName.Text = "";
//更新法式
if(this._Update)
{
//封閉原本的運用法式
this.labDownFile.Text = "正在封閉法式....";
System.Diagnostics.Process[]proc=System.Diagnostics.Process.GetProcessesByName("TIMS");
//封閉原有運用法式的一切過程
foreach(System.Diagnostics.Process pro in proc)
{
pro.Kill();
}
DirectoryInfo theFolder=new DirectoryInfo(Path.GetTempPath()+"JurassicUpdate");
if(theFolder.Exists)
{
foreach(FileInfo theFile in theFolder.GetFiles())
{
//假如暫時文件夾下存在與運用法式地點目次下的文件同名的文件,則刪除運用法式目次下的文件
if(File.Exists(Application.StartupPath + \\"+Path.GetFileName(theFile.FullName)))
File.Delete(Application.StartupPath + "\\"+Path.GetFileName(theFile.FullName));
//將暫時文件夾的文件移到運用法式地點的目次下
File.Move(theFile.FullName,Application.StartupPath + \\"+Path.GetFileName(theFile.FullName));
}
}
//啟動裝置法式
this.labDownFile.Text = "正在啟動法式....";
System.Diagnostics.Process.Start(Application.StartupPath + "\\" + "TIMS.exe");
this.Close();
}
}