制作c#安裝程序/使用安裝服務類自定義安裝事件


第一步:建立工程 
1.打開vs,新建項目->其他項目類型->安裝和部署(),新建安裝項目,命名為SetupTest。 2.新建工程后,可以在“解決方案資源管理器”里面看到子項:文件系統編輯器,注冊表編輯器,文件類型編輯器,用戶界面編輯器,自定義操作編輯器,啟動條件編輯器。下面將會舉例來說明各個地方怎么使用。 
3.最簡單的一個安裝程序:點擊“文件類型編輯器”,找到“應用程序文件夾”,添加->文件,選擇你要打包的程序文件(譬如我的程序有run.exe和lib.dll組成),確定。在項目“SetupTest”上點擊生成,一個簡單的安裝包就做好了。生成后,點擊安裝,如果沒有錯誤的話,你現在可以看到你的安裝包的效果了。 
4.如何自定義代碼?在制作過程中,這些簡單的功能不能滿足你的要求,那么就自己寫代碼來完成吧。 
解決方案->添加->新建項目->類庫,命名為Library,在項目Library下面,刪除Class1.cs,添加->新建項目->安裝程序類(名稱為InstallerTest.cs),打開InstallerTest.cs,你會發現這個class InstallerTest繼承自Installer,里面就一個構造函數。好了,現在安裝程序不能完成的功能,你可以在這個類寫代碼來自己實現了。     舉例:在構造函數里面添上this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall),實現方法
InstallerTest_BeforeInstall(object sender, InstallEventArgs e),就可以完成程序在安裝之前要做的事情了,Installer主要要用到的事件不外乎這幾個:BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall,很明顯的意義,就不用解釋了吧 
 
5.完成了4中的InstallerTest_BeforeInstall事件,是不是在安裝之前就要執行
InstallerTest_BeforeInstall中的代碼呢,答案是不行。還要用到“自定義操作編輯器”。項目SetupTest->添加->項目輸出->選擇Library->選擇主輸出和內容文件后確定,你會發現,在項目SetupTest下面多了一項“主輸出來自Library(活動)” 和一項“內容文件來自
Library(活動)”的字樣。好,到正題了,來到“自定義操作”處,可以看到四個子項:安裝,提交,回滾,卸載。在安裝上面點擊右鍵->添加自定義操作->選擇“主輸出來自Library(活動)”。這樣,重新生成后,安裝之前就會執行InstallerTest_BeforeInstall代碼了。(當然,如果你在要在卸載前后做一些事情,就必須在“卸載”處也把自定義操作添加進去,否則即使監聽了事件AfterUninstall,也不會執行的,完全之策是在安裝,提交,回滾,卸載里面都把主輸出來自Library(活動)添加進去就不怕了,嘿嘿) 
  
6.如何得到用戶所選安裝路徑?在實現代碼的時候,用戶所選安裝路徑大多數情況下都要用到,怎么得到他的值呢?在自定義操作->安裝->“主輸出來自Library(活動)”上面右鍵屬性,在CustomActionData中填入/targetdir="[TARGETDIR]\", 然后在類InstallerTest中用這句話this.Context.Parameters["targetdir"] 就可以取得安裝的目錄了。 
 
7.如何得到用戶在安裝的時候輸入的更多的信息?用戶在安裝的時候,還有可能塡很多其他的信息,比如我以前做的一個安裝文件中包含安裝數據庫,安裝的時候用戶就要填寫數據庫密碼,用戶名等信息。實現如下:用戶界面->安裝->啟動->右鍵->添加對話框->選擇"文本框(A)",可以看到文本框(A)有很多屬性,如:Edit1Label,Edit1Property,Edit1Value,Edit1Visible等,Edit1Label就是這個輸入框所要輸入的內容的提示語,Edit1Value就是所輸入的內容。 例如:將Edit1Label內容填上“請輸入數據庫用戶名:”,將Edit1Property內容填上DBUSER,Edit1Visible選問true,另外在6中所提到的CustomActionData中,添加上 /dbuser="[DBUSER]",再在InstallerTest中用這句話this.Context.Parameters["dbuser"] 就可以或得用戶在安裝的時候所填寫的用戶名了(其他的單選框,復選框,button按鈕框都差不多獲取值的方法,不再累贅).總之,添加了一些對話框后,把屬性好,還要在CustomActionData添加一個/parm="[屬性值]",才能在代碼中獲取改值。 

注:如果想要在CustomActionData中添加多個參數,則用空格隔開,如果參數是路徑,格式為/parm="[屬性值]\" 
8.刪除安裝文件。上面的都做好了,一個安裝程序就基本完成了。運行剛做好的安裝程序,提示安裝完成,這時如果你打開安裝目錄會發現許多.tmp文件。這是安裝時用到的臨時文件,在最后應該刪掉。仿照4添加一個InstallerTest_AfterInstall事件,在事件中寫刪除代碼。思路:取出安裝目錄下的所有文件,篩選出.tmp文件並將它們刪除。下面是我的作法: 
File.Delete(this.Context.Parameters["targetdir"]+"test"); string[] filenames = 
Directory.GetFiles(this.Context.Parameters["targetdir"]); int i = 0; 
while (i<filenames.Length&& filenames[i] != null)                 { 
if (filenames[i].Substring(filenames[i].Length - 3, 3)=="tmp")                     { 
File.Delete(filenames[i]);                     } i++; 
                } 
注意:要引入System.IO命名空間。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM