C# winform 安裝程序打包(自定義操作)


(一),安裝程序

以前用vs制作過安裝程序,現在把步驟寫出來,有幫助的大家一定要頂哦

第一步:建立工程
1.打開vs,新建項目->其他項目類型->安裝和部署(這個子項下面有安裝項目和Web安裝項目等,安裝項目就是普通的桌面程序安裝,Web安裝就是安裝網站,通常安裝到IIS下,這里以普通桌面程序安裝為例),新建安裝項目,命名為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,很明顯的意義,就不用解釋了吧

//////////////////////////////////////////////////////////////////////////////安裝文件實例代碼(安裝后執行批處理)///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public InstallerTest()
        {
            InitializeComponent();
            //this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall);
            this.AfterInstall+=new InstallEventHandler(InstallerTest_AfterInstall);
        }
        private void InstallerTest_AfterInstall(object sender, InstallEventArgs e)
        {
            //throw new ApplicationException("suc ok");
            string path = this.Context.Parameters["targetdir"];
            string command = path + "\\a.bat";
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo = new System.Diagnostics.ProcessStartInfo(command);
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.WriteLine("exit");
            p.Close();

        }

//////////////////////////////////////////////////////////////////////////////  END  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

5.完成了4中的InstallerTest_BeforeInstall方法,是不是在安裝之前就要執行 InstallerTest_BeforeInstall中的代碼呢,答案是不行。還要用到“自定義操作編輯器”。項目SetupTest->添加 ->項目輸出->選擇Library后確定,你會發現,在項目SetupTest下面多了一項“主輸出來自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="[屬性值]",才能在代碼中獲取改值。

8.其他:創建快捷方式,你可能在程序中要創建多個快捷方式,這里展示一種寫代碼的方式來創建快方式(各個選項意義就不說了,其中有些選項是可以不需要的,讀者可自己測試選擇使用)

添加引用:com名稱為Windows Script Host Object Model

               using IWshRuntimeLibrary; 
string dk = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);//得到桌面文件夾
                IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShellClass();
                IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(@dk + "//快捷方式到數據中心SiteDataCenter.lnk");
              
shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(@dk + "//互聯網公共上網服務場所信息安全管理系統.lnk");
                    shortcut.TargetPath = @"%HOMEDRIVE%/Program Files/Internet Explorer/IEXPLORE.EXE";
                    shortcut.Arguments = "http://localhost/web/Main.html";// 參數
                    shortcut.Description = "火星網絡安全有限責任公司"; 
                    shortcut.WorkingDirectory = pathWeb;//程序所在文件夾,在快捷方式圖標點擊右鍵可以看到此屬性
                    shortcut.IconLocation = "notepad.exe, 0";//圖標 
                    shortcut.Hotkey = "CTRL+SHIFT+N";//熱鍵 
                    shortcut.WindowStyle = 1; 
                    shortcut.Save(); 
                    
9.如何在安裝完成后自動運行某個程序呢(如run.exe)?
將這句代碼寫在AfterInstall里面:
                System.Diagnostics.ProcessStartInfo psiConfig = new System.Diagnostics.ProcessStartInfo(path + "http://www.cnblogs.com/lmjob/admin/file://run.exe");//path 即是安裝的目錄
                System.Diagnostics.Process pConfig = System.Diagnostics.Process.Start(psiConfig);

(二)卸載(以下是轉的,看客自己提取有用信息)

1.新建一C# Windows From項目,完成項目的工作

2.菜單-》文件-》添加項目-》新建項-》安裝部署項目-》安裝向導

選擇上面那個項目的主輸出。

在安裝項目的屬性欄中會顯示出"XXX部署項目屬性",在第一個AddRemoveProgramsIcon屬性后"瀏覽"到你的ICO圖標,接着在下面Author輸入作者名,也就是你的名字,其他Localization是語言屬性,Manufacturer,ProductName的屬性將是用戶在安裝時默認設置的文件夾路徑一部分了,設置Title為你的應用程序標題名稱。

3.右擊"安裝項目"上,選擇文件系統視圖

在應用程序文件夾,添加一個文件,如果是WIN98下的安裝,請選擇WIN98操作系統目錄下的msiexec.exe文件(一般在 c:/windows/system目錄下);如果是其他,比如WIN2K系列,請選擇該操作系統目錄下的msiexec.exe文件(一般在 /winnt/system32目錄下)。

4.在文件系統視圖的"用戶程序菜單"里,添加一個目錄,命名為項目的名字,

並且,在這個目錄里,添加一個快捷方式,指向項目的主輸出,

再添加一個快捷方式,指向加入的文件Msiexec.exe,命名為:"卸載",

5.在解決方案里,選擇安裝項目,再打開屬性視圖,打開安裝項目的屬性面板,里面有一項:

ProductCode {5284694C-24C1-4FCF-A705-D4B9A0081274}

把后面的{5284694C-24C1-4FCF-A705-D4B9A0081274},復制一下。

6.在"卸載"快捷方式的屬性里,有一個叫Arguments的屬性欄,在屬性欄中首先填入"/x"后加一個空格,再"粘貼",將ProductCode的屬性值COPY至此。

7、再在VS.Net的頂部菜單欄中"生成"-"生成 XXXX"(XXXX為你的項目名稱)

 

 

補充:合並模塊項目的使用


若在某個大型的安裝程序中,模塊飛分為模塊1,模塊2等,每次都把模塊N的文件加進來重新編譯就很麻煩,這是就可用“合並模塊項目(MergeModule)”。
1.新建一個合並模塊項目,名字為MergeModule1,添加需要的文件,生成后,將看到MergeModule1.msm
2.在這個大型的安裝程序中,添加“合並模塊”,將MergeModule1.msm添加進去
3.生成,安裝,你會發現MergeModule1的內容也被安裝到了安裝目錄下


免責聲明!

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



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