在某年的一個暑假,很想把已經寫好的“鋤大地”遊戲跟馮Boy分享一下,可是那時候不會做一個自動安裝.NET Framework4.0的安裝包,很遺憾無法跟她分享我的成果。
最近上頭有任務,讓我去為團隊的成果打一個包,而且項目運行時必備的SQL Server、.NET Framework都要一鍵安裝,項目用到的資料庫和連接埠都要在安裝的時候一同搞好,這回總算是會了。
安裝項目介紹
建立一個安裝包的項目
建好了項目之後就有這個介面:檔案系統編輯器
還有其他類型的編輯器。
由左往右分別是:檔案系統編輯器,登錄編輯程式,檔案類型編輯器,使用者介面編輯器,自訂動作編輯器,啟動條件編輯器。
到現時為止,只用到三個編輯器
- 檔案系統編輯器:編輯安裝到目標電腦後,各個檔案放置的情況,就上面那幅圖所示,“應用程式檔案夾”裡塞的就是程式所有東西;“使用者的‘程式’菜單”就是開始菜單中的內容,這裡一般會有程式的捷徑、卸載程式;“使用者案頭”就是案頭上方的東西了,一般就有程式的捷徑了,如果特別一點的就像酷狗的弄多一個檔案夾出來。
- 使用者介面編輯器:這個用於編輯安裝程式時彈出的介面,可以調換各個對話方塊出現的順序,如果有需要的話,就可以另外增加一些別的對話方塊,例如填上資料庫的執行個體名,IP地址,連接埠號碼之類的。
- 自訂動作編輯器:當在安裝過程中還要做其他的操作,例如附加資料庫,檔案複製等等,就需要這個自訂動作了。自訂動作則需要另外加項目,一個類庫項目,關鍵的是類庫裡面需要一個安裝程式類
安裝包製作
介紹完各個編輯器之後開始製作安裝包了
開啟“檔案系統編輯器”,右擊應用程式檔案夾 —》 添加 —》 檔案,在彈出的對話方塊選擇要安裝到目標電腦裡面的檔案(包括exe和dll)
通過類似的方式可以在“使用者‘程式’菜單”和“使用者案頭”裡面新增內容。最簡單的就是添加捷徑
如果要在安裝過程中做一些操作(拷貝某些檔案,開連接埠,附加資料庫等等),則要編寫安裝程式類了。在上面說的那個Installer1類中
可以重寫一些方法根據各個不同是的時候選擇適合的方法,這裡就OnBeforeInstall方法。
protected override void OnBeforeInstall(IDictionary savedState) { //從使用者介面擷取的參數 string portId = Context.Parameters["PortId"]; base.OnBeforeInstall(savedState); //自己定義的一個利用命令列開放連接埠的方法 OpenPort(portId); }
安裝程式類定義好之後,回到“檔案系統編輯器”添加一個項目輸出
選擇剛才安裝程式類所在的項目。
接著到“自訂動作編輯器”在安裝的節點右鍵—》添加自訂動作,在彈出的對話方塊選擇剛才添加的主輸出*****
上面開放連接埠需要一個連接埠號碼,而這個連接埠號碼則是從使用者介面傳入的。在“使用者介面編輯器”中的啟動節點右擊—》添加對話方塊,彈出的對話方塊選擇適當類型的對話方塊。
這裡只選擇文字框(A)就足夠了。
編輯這對話方塊的內容,可以在屬性視窗編輯。
這裡有BannerBitmap,BannerText,BodyText和四組Edit開頭的屬性,相信通過這幅圖就知道各個屬性的含義了,EidtVisible就是控制那組文字框是否顯示
而這裡只需要把Eidt1的顯示就可以了,並且各個屬性設成這樣
然後回到自訂動作處編輯開啟主輸出****的屬性視窗,給CustomActionData屬性附上這樣的值
/PortId="[PORTID]"
等號前的是安裝程式類的Context.Parameters["PortId"];裡面的參數名,後面的PORTID是使用者介面EditPorert屬性的值,這如果有多個參數的話 要用空格隔開,如:
/Para1="[PARA1]" /Para2="[PARA2]"
整個安裝程式大致完成了,最後要是程式啟動並執行時候要有什麼必備的組件,例如(.NET Framework),就要在安裝項目右擊,開啟屬性視窗,點擊系統必備,選擇必備要組件。
這裡放一個小插曲,如果在這裡勾選了SQL Server 2005 Express的,在產生的時候報錯了,本人嘗試在安裝程式類中利用代碼調用命名一鍵安裝SQL Server,可是失敗了,原因是系統只允許一個Instraller運行。最終還是得勾選SQL Server 2005 Express的,至於解決方案,得參照另一篇博文《自訂系統必備》
右擊安裝項目產生,安裝包就產生了
Setup.exe是一鍵安裝組件的安裝程式,msi尾碼的安裝程式是跳過了組件安裝的安裝程式。到這裡安裝包的製作算是完成了。要是在那個暑假我懂得這些,就能跟馮Boy分析我編寫的小遊戲了,遺憾呐!
本文的思緒有點紊亂,還得請各位多多指教。謝謝!