c#自动更新+安装程序的制作
一、自動(dòng)更新的實(shí)現(xiàn)
讓客戶端實(shí)現(xiàn)自動(dòng)更新,通常做法是在客戶端部署一個(gè)單獨(dú)的自動(dòng)更新程序。主程序啟動(dòng)后,訪問(wèn)服務(wù)端,檢查配置文件是
否有更新版本,有更新版本就啟動(dòng)更新程序,由更新負(fù)責(zé)下載更新版本,并更新客戶端程序,流程如下:
當(dāng)流程進(jìn)行到紅色部分的是后就調(diào)用更新程序進(jìn)行更新。
1)版本判斷:
客戶端和服務(wù)端都部署同一個(gè)版本文件,客戶端登陸時(shí)發(fā)送驗(yàn)證給服務(wù)端判斷版本是否一致。
Version.xml代碼
<iq xmlns="http://www.dynastech.com/xmtp" from="*@domcool.local/updater" to="*@domcool.local/updater" type="get" id="508f3e88-4bb0-4585-a5c6-cc41ef57fef3"><query xmlns="http://www.dynastech.com/xmtp/disco#update" version="20090922" lastUpdateTime="2009-09-22" fileUrl="http://172.0.0.1/UCCompanion/UCCompanionSetup(0922).zip <"> x xmlns="http://www.dynastech.com/xmtp/item"></x></query> </iq> 版本文件主要比較服務(wù)端Version.xml文件和客戶端Version.xml文件中Version(版本號(hào))是否一致,如果服務(wù)端Version屬性 大于客戶端的Version屬性,則通過(guò)服務(wù)端的fileUrl屬性獲取新版本的下載地址。供更新程序使用。 2)刪除原有更新包 所有客戶端更新文件均下載到C:\Documents and Settings\當(dāng)前用戶名\Local Settings\Temp 文件夾內(nèi),當(dāng)客戶端運(yùn)行后首先判 斷是否有新更新包需要下載,如果沒(méi)有則判斷該臨時(shí)文件夾內(nèi)是否有舊有安裝文件,如果存在,則刪除舊有安裝文件。 private void RemoveOldSetupFile(){try{string temp = System.Environment.GetEnvironmentVariable("TEMP");string folder = new DirectoryInfo(temp).FullName;if (File.Exists(folder + @"\" + setupName + ".exe")){File.Delete(folder + @"\" + setupName + ".exe");}if (File.Exists(folder + @"\" + setupName + ".msi")){File.Delete(folder + @"\" + setupName + ".msi");}}catch { }}備注:關(guān)于獲取系統(tǒng)特殊文件夾的方法見(jiàn)博客http://www.cnblogs.com/thornfield_he/archive/2009/09/22/1571719.html
3)啟動(dòng)下載程序
下載程序和客戶端程序是相互獨(dú)立的,可以通過(guò)客戶端開(kāi)啟新線程啟動(dòng)下載程序。下載程序在文件下載結(jié)束后可以關(guān)掉客戶端程序,
并開(kāi)啟新線程啟動(dòng)安裝程序進(jìn)行安裝。
程序代碼
將AutoUpdater項(xiàng)目生成的文件添加到客戶端文件中,在客戶端的Update()方法里調(diào)用updater,實(shí)現(xiàn)更新文件的下載。
以上就已經(jīng)實(shí)現(xiàn)了自動(dòng)更新功能,下面將討論文件安裝包的制作。二、安裝包的制作
1)創(chuàng)建安裝項(xiàng)目
?
?
2)鼠標(biāo)右擊Setup項(xiàng)目選擇>視圖,可以看到制作安裝包常見(jiàn)的視圖有以下幾個(gè)
最常用的視圖有“文件系統(tǒng)”,“用戶界面”和“啟動(dòng)條件”。
3)指定安裝屬性
鼠標(biāo)左鍵單擊項(xiàng)目名稱,記住是左鍵單擊,然后點(diǎn)擊屬性標(biāo)簽,注意:不是右擊的屬性
?
?
a.需要注意的是Version屬性,每次版本更新時(shí)Version值必須后面的版本大于前面的版本。每次更改Version值時(shí)Projectcode會(huì)更改一次。
其中你修改安裝項(xiàng)目的版本號(hào)時(shí),比如從v1.00 到1.01,在你再次生成項(xiàng)目的時(shí)候,會(huì)提示你是否允許修改ProductCode,選擇"是",
程序會(huì)自動(dòng)修改ProductCode,選擇否將保持相同的ProductCode,即不能自動(dòng)卸載舊的版本.
b.在以后版本中要確認(rèn)和以前的版本兩個(gè)版本有不同的ProductCode和相同的UpgradeCode
c.manufacturer屬性指定制造商名稱。
d.detectnewerinstalledversion屬性選擇為true,
e.removepreviousversions選擇為true
?
鼠標(biāo)左鍵單擊項(xiàng)目名稱,此次是右鍵單擊,然后點(diǎn)擊屬性,彈出屬性頁(yè),選擇“系統(tǒng)必備”。
在打開(kāi)的系統(tǒng)必備頁(yè)中,選中如下中的選擇項(xiàng),這個(gè)很重要!!!!!1!!!!!選上以后,在生成的安裝文件包中
包含.netframework組件.(這個(gè)選項(xiàng)默認(rèn)是沒(méi)有選中的)。
?
4)文件系統(tǒng)視圖
文件系統(tǒng)視圖左側(cè)根目錄樹(shù)下有3個(gè)子節(jié)點(diǎn)。
a.應(yīng)用程序文件夾:將所有待打包的應(yīng)用程序的可執(zhí)行文件和相應(yīng)的類庫(kù)和組件拖動(dòng)到該目錄下。該目錄可以創(chuàng)建子
目錄,項(xiàng)目安裝完畢以后的文件夾結(jié)構(gòu)會(huì)和該目錄下結(jié)構(gòu)一致。
如圖:
然后右擊左邊的"應(yīng)用程序文件夾"打開(kāi)屬性對(duì)話框,修改文件釋放路徑,[ProgramFilesFolder][Manufacturer]\[ProductName]。
安裝程序默認(rèn)安裝目錄會(huì)是"c:\programm file\制造商名稱\安裝解決方案名稱";
b.用戶的“程序”菜單和用戶桌面:用于在開(kāi)始菜單創(chuàng)建文件快捷方式
在應(yīng)用程序文件夾中將需要生成的快捷方式的文件添加快捷方式并拖動(dòng)到用戶的“程序”菜單和用戶桌面
?
?
?
c.添加文件卸載功能
在添加你的應(yīng)用程序項(xiàng)目的時(shí)候,多添加一個(gè)msiexec.exe進(jìn)去,這個(gè)文件在c:\windows\system32文件夾下。
為其在程序菜單添加一個(gè)快捷方式,把他的名字改成"Uninstall.exe",指定Icon快捷方式顯示的圖標(biāo)。然后下面我們
要的做的就是查找這個(gè)部署項(xiàng)目的ProductCode了,鼠標(biāo)左鍵單擊項(xiàng)目名稱,記住是左鍵單擊,然后點(diǎn)擊屬性標(biāo)簽,注意:
不是右擊的屬性,這個(gè)區(qū)別很大,這時(shí)你就可以看到ProductCode了
?
?
?
然后打開(kāi)你創(chuàng)建的那個(gè)卸載程序的快捷方式的屬性對(duì)話框,在Aguements屬性中輸入"/x {ProductCode}"
5)用戶界面視圖
在“歡迎使用”后,“安裝文件夾”前添加“許可協(xié)議”對(duì)話框。
licensefile選擇協(xié)議,協(xié)議的格式為rtf。
6)啟動(dòng)條件視圖
為啟動(dòng)安裝程序制定最低framework要求。
7)實(shí)現(xiàn)安裝、卸載過(guò)程中的其他額外的操作。比如安裝結(jié)束后啟動(dòng)程序,卸載程序后同時(shí)刪除網(wǎng)絡(luò)下載打安裝包等功能。
a.新建一個(gè)空的項(xiàng)目InstallCompenent,步驟為:解決方案->右鍵添加->新建項(xiàng)目->選擇"空項(xiàng)目"->
輸入名稱"InstallCompenent"->確定,完成項(xiàng)目的添加.
b.在InstallCompenent項(xiàng)目中右鍵->添加->新建項(xiàng)->選擇安裝程序類->輸入名稱"Installer",完成installer類的添加.
修改代碼為:
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Reflection; using System.IO;namespace InstallCompenent {[RunInstaller(true)]public partial class UccompanionInstaller : Installer{private const string zipPacket = "UCCompanionSetup(0918).zip";/// <summary> /// 應(yīng)用程序入口 /// </summary> public static void Main(){}/// <summary> /// 構(gòu)造函數(shù) /// </summary> public UccompanionInstaller(){InitializeComponent();}/// <summary> /// 重寫安裝完成后函數(shù) /// 實(shí)現(xiàn)安裝完成后自動(dòng)啟動(dòng)已安裝的程序 /// </summary> /// <param name="savedState"></param> protected override void OnAfterInstall(IDictionary savedState){base.OnAfterInstall(savedState);Assembly asm = Assembly.GetExecutingAssembly();string path = asm.Location.Remove(asm.Location.LastIndexOf("\\")) + "\\";System.Diagnostics.Process.Start(path + "\\UCCompanion.exe");}/// <summary> /// 重寫安裝過(guò)程方法 /// </summary> /// <param name="stateSaver"></param> public override void Install(IDictionary stateSaver){base.Install(stateSaver);}/// <summary> /// 重寫安裝之前方法 /// </summary> /// <param name="savedState"></param> protected override void OnBeforeInstall(IDictionary savedState){base.OnBeforeInstall(savedState);}/// <summary> /// 重寫卸載方法 /// 卸載程序后也刪除程序的安裝包/// </summary> /// <param name="savedState"></param> public override void Uninstall(IDictionary savedState){string temp = System.Environment.GetEnvironmentVariable("TEMP");string folder = new DirectoryInfo(temp).FullName;if (File.Exists(folder + @"\setup.exe")){File.Delete(folder + @"\setup.exe");}if (File.Exists(folder + @"\setup.msi")){File.Delete(folder + @"\setup.msi");}if (File.Exists(folder + @"\"+zipPacket)){File.Delete(folder + @"\"+zipPacket);}base.Uninstall(savedState);}/// <summary> /// 重寫回滾方法 /// </summary> /// <param name="savedState"></param> public override void Rollback(IDictionary savedState){base.Rollback(savedState);}} }?
c.在安裝項(xiàng)目中右鍵->添加項(xiàng)目輸出->選擇"項(xiàng)目"->InstallCompenent.完成主輸出項(xiàng)目的添加.
d.打開(kāi)自定義操作編輯器,在安裝->右鍵->添加自定義操作->選擇"應(yīng)用程序文件夾"->選擇"主輸出來(lái)自InstallCompenent",完成添加.
好了,點(diǎn)擊“生成解決方案”,即可以生成帶有卸載功能的安裝程序了。
?
轉(zhuǎn)自:http://blog.csdn.net/myhuli120/article/details/6927588
轉(zhuǎn)載于:https://www.cnblogs.com/elim/p/3968333.html
總結(jié)
以上是生活随笔為你收集整理的c#自动更新+安装程序的制作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 四则运算2任务完成表
 - 下一篇: 链表的经典问题