1. 程式人生 > >VS2010製作網站自定義安裝程式

VS2010製作網站自定義安裝程式

  最近在把一個網站打包成安裝程式,這方面的文章網上有很多,也看了不少,但因為開發環境的不同,遇到了一些問題,便寫下這篇文章記下整個流程(有很多資源都來自網際網路,由於條目頗多,所以無法說明其來處,敬請諒解)。

一、開發環境

        言歸正傳,先說明一下開發環境,win7 64位+visual studio 2010+IIS7。

二、製作流程

1、釋出網站

        要製作網站自定義安裝程式,首先,我們得有一個準備打包的網站。我這裡是一個ASP.NET網站。接下來就要對這個網站進行預編譯,右擊“解決方案資源管理器”的網站,選擇“釋出網站”,即可將網站釋出到本地機器上。預編譯主要是將網站的原始碼編譯成相應的動態連結庫。


2、新建“安裝專案”

        接下來,在vs中開啟“新建專案”->“其他專案型別”->“安裝和部署”->“Visual Studio Installer”,選擇“安裝專案“,命名MyWebSite。“Web安裝專案”也可進行網站安裝程式的製作,但相對“安裝專案”,其安裝過程不好控制(雖然“安裝專案”也有一些控制不到的地方,但目前已足夠)。

        在“安裝專案”有如下按鈕:檔案系統編輯器、登錄檔編輯器、檔案型別編輯器、使用者介面編輯器、自定義操作編輯器、啟動條件編輯器。


3、新增安裝時顯示的對話方塊

        開啟“使用者介面編輯器”,分為安裝與管理員安裝兩個部分

“安裝”部分是我們要用到的而“管理員安裝”網上有人說是系統管理員將安裝程式上傳到某個網路位置時顯示的對話方塊(不甚理解,以後用到再補充)。

    右鍵點選“啟動”節點,選擇“新增對話方塊”,依次新增“自述檔案”、“許可協議”、“文字框(A)”、“複選框(A)”,如下圖所示。


    這裡先介紹文字框和複選框的設定,點選“文字框(A)”,在“屬性”視窗中則可看到其相應設定(其他對話方塊類似),現列舉出各選項含義,

    BannerBitmap:此文字框的橫幅圖片,即下圖banner所指的那張圖片,可以為bmp或jpg格式。後面會講如何設定。

    BannerText:相當於此文字框的標題

    BodyText:Banner下對此文字框作用的說明

    Edit1Label:輸入框上的標題

    Edit1Property:輸入框的屬性值,要獲得輸入框的內容,就得通過它

    Edit1Value:輸入框預設顯示的內容

    Edit1Visible:輸入框可見性,false即隱藏


    複選框(A)設定與文字框(A)類似,只是其中CheckBox1Value值有點區別,如果勾選了某個複選框,則該複選框CheckBox1Value值為Checked(程式獲得值為1),不選則為Unchecked(程式獲得值為空)。

4、新建安裝類庫

    自定義安裝的程式碼即在此類庫中,它將完成根據使用者輸入的資訊配置IIS站點等功能

    “檔案”->“新增”->“新建專案”->“Visual C#”->“Windows”,選擇“類庫”,命名為“WebSetupClassLib”,刪除自動生成的Class1.cs。

    右鍵點選類庫名,“新增”->“新建項”->“Visual C#”項(常規),選擇“安裝程式類”,命名為“MyWebInstaller”。

    檢視MyWebInstaller的程式碼,安裝程式類其實是繼承自Installer類(實現自定義安裝的關鍵)的區域性類:

  1. using System;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using System.ComponentModel;  
  5. using System.Configuration.Install;  
  6. using System.Linq;  
  7. namespace WebSetupClassLib  
  8. {  
  9.     [RunInstaller(true)]    //安裝程式集時呼叫自定義操作安裝程式
  10.     public partial class MyWebInstaller : System.Configuration.Install.Installer  
  11.     {  
  12.         public MyWebInstaller()  
  13.         {  
  14.             InitializeComponent();  
  15.         }  
  16.     }  
  17. }  

5、新增自定義操作(相當於安裝類庫與程式安裝等行為的連線)

先暫且不管安裝程式類,右鍵單擊安裝類庫,選擇“生成”。

   接著右鍵單擊安裝專案“MyWebSite”,選擇“新增”->“專案輸出”,選擇安裝類庫WebSetupClassLib(出現前提是執行上一步的“生成”),如下圖。


   此時,安裝專案“MyWebSite”下將多了兩項,一個是“主輸出來自WebSetupClassLib(活動)”,另一個是“檢測到的依賴項”下多了一個“Microsoft .NET Framework”(因為安裝類庫WebSetupClassLib的目標框架是.NET Framework 4,安裝專案需要提供對它的支援)。

   然後點選安裝專案的“自定義操作編輯器”,裡面有四個類似於資料夾的項,分別為安裝、提交、回滾、解除安裝。提交指安裝完後的動作,回滾指安裝不成功程式回滾執行的動作。

   右擊“安裝”,選擇“新增自定義操作”,在彈出的“選擇專案中的項”對話方塊中選擇應用程式資料夾,選中“主輸出來自WebSetupClassLib(活動)”,確定。


   這樣在安裝時,程式就會自動執行安裝類庫中的自定義安裝操作(如:Install函式)。

   同樣的方式,在“提交”和“解除安裝”也加入“主輸出來自WebSetupClassLib(活動)”,回滾暫時沒用到,不用加。

6、獲取使用者輸入資訊

在自定義安裝操作前,先得知道在安裝程式類“MyWebInstaller”中如何獲取網站安裝過程中使用者輸入的資訊(如web伺服器地址,埠)。

   切換到“自定義操作”->“安裝”專案下,點選“主輸出來自WebSetupClassLib(活動)”,在“屬性”視窗有個“CustomActionData”選項。


   在其中填入:/port=[PORT] /iis=[IISSERVER] /targetdir="[TARGETDIR]\"

   []內是屬性名,如在文字框(A)中,有

    Edit1Label:web伺服器地址

    Edit1Property:IISSERVER

    Edit1Value:192.168.1.100

   “web伺服器地址”的屬性名就是Edit1Property的值IISSERVER

   “web伺服器地址”的值就自動賦給了iis,[TARGETDIR]是安裝路徑,程式定義,不是自定義,需如此書寫"[TARGETDIR]\",每項間必須有空格,根據需要自行加入。

   在MyWebInstaller中獲得值:string webIP = this.Context.Parameters["iis"].ToString();    //web伺服器IP

   即獲得了使用者輸入的“web伺服器地址”,如192.168.1.12。

   注意:在獲取使用者所選安裝路徑時,string physicaldir = this.Context.Parameters["targetdir"].ToString();  //網站物理路徑

        假設路徑是“D:\test\”,則physicaldir的值是“D:\\test\\\\”(\\中一個\是轉義字元,另一個才是表示路徑的\),所以,實際表         示路徑是“D:\test\\”,顯然不對(test後多了一個\)。
        還要進行如下操作:physicaldir = physicaldir.Substring(0, physicaldir.Length - 1);

        這裡中了招,幸好有除錯,才得以解決(但為何獲得的路徑會多個"\"?)。

7、重寫自定義安裝相關方法

    要安裝時執行自定義動作,就得重寫Installer類中的相關函式(發現函式呼叫順序OnBeforeInstall->OnAfterInstall->Install,猜測可能原因是前兩個是事件,後一個Install是函式,因此前兩個和後一個沒有必然聯絡)。

    有兩種方式:

    1、public override void Install(IDictionary stateSaver)

    2、在建構函式中加入this.BeforeInstall += new InstallEventHandler(MyWebInstaller_BeforeInstall);

       然後定義函式private void MyWebInstaller_Install(object sender, InstallEventArgs e){//自定義安裝程式碼}

       但是此法不針對Install,如this.Install += new InstallEventHandler(MyWebInstaller_Install);是不對的,因為Install只是一個方法而已,而非事件。

    A、重寫安裝(Installer)方法

安裝方法中包括以下內容:獲取使用者輸入資訊、新建IIS應用程式池、新建IIS站點、配置IIS站點、設定網站目錄許可權、修改web配置檔案、網站ID寫入登錄檔、建立桌面快捷方式、建立應用程式選單項。

  1. #region 程式安裝
  2. publicoverridevoid Install(IDictionary stateSaver)  
  3. {  
  4.     base.Install(stateSaver);  
  5.     //System.Diagnostics.Debugger.Launch();
  6.     physicaldir = this.Context.Parameters["targetdir"].ToString();  //網站物理路徑
  7.     physicaldir = physicaldir.Substring(0, physicaldir.Length - 1);  
  8.     virtualdir = this.Context.Parameters["virtualdir"].ToString();  //網站虛擬路徑
  9.     dbname = this.Context.Parameters["dbname"].ToString();  //資料庫名
  10.     dbserver = this.Context.Parameters["dbserver"].ToString();  //資料庫伺服器名稱
  11.     user = this.Context.Parameters["user"].ToString();  //資料庫連線使用者
  12.     pwd = this.Context.Parameters["pwd"].ToString();    //資料庫連線密碼
  13.     iis = this.Context.Parameters["iis"].ToString();    //web伺服器IP
  14.     port = this.Context.Parameters["port"].ToString();  //站點埠
  15.     websitename = this.Context.Parameters["websitename"].ToString();  //即站點名
  16.     isrun = this.Context.Parameters["run"];   //安裝完成後是否執行
  17.     NewWebSiteInfo siteinfo = new NewWebSiteInfo(iis, port, "", websitename, @physicaldir);//@意為忽略轉義字元含義
  18.     CreateNewWebSite(siteinfo);  
  19.     SetFileRole();  
  20.     WriteWebConfig();  
  21.     WriteToReg("WebSiteID");  
  22.     if (this.Context.Parameters["deskcut"] == "1")    //建立桌面快捷方式
  23.     {  
  24.         CreateDeskTopCut();  
  25.     }  
  26.     if (this.Context.Parameters["pmenu"] == "1")    //建立應用程式選單項
  27.     {  
  28.         CreateProCut();  
  29.     }  
  30. }  
  31. #endregion
B、IIS站點資訊管理類

        在安裝類庫WebSetupClassLib中,新增一個類,類名為NewWebSiteInfo,該類主要是管理站點相關資訊,包括站點IP、埠號、站點名等等。程式碼如下:

  1. namespace SetupClassLibrary  
  2. {  
  3.     publicclass NewWebSiteInfo  
  4.     {  
  5.         privatestring hostIP; // 主機IP
  6.         privatestring portNum; // 網站埠號
  7.         privatestring descOfWebSite; // 網站表示。一般為網站的網站名。如"www.myweb.com.cn"
  8.         privatestring nameOfWebSite;// 網站名稱。如"我的網站",此處即為在IIS管理器中的網站名稱
  9.         privatestring webPath; // 網站的主目錄。例如@"e:\\ mp"
  10.         public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string nameOfWebSite, string webPath)  
  11.         {  
  12.             this.hostIP = hostIP;  
  13.             this.portNum = portNum;  
  14.             this.descOfWebSite = descOfWebSite;  
  15.             this.nameOfWebSite = nameOfWebSite;  
  16.             this.webPath = webPath;  
  17.         }  
  18.         publicstring BindString  
  19.         {  
  20. 相關推薦

    VS2010製作網站定義安裝程式

      最近在把一個網站打包成安裝程式,這方面的文章網上有很多,也看了不少,但因為開發環境的不同,遇到了一些問題,便寫下這篇文章記下整個流程(有很多資源都來自網際網路,由於條目頗多,所以無法說明其來處,敬請諒解)。 一、開發環境         言歸正傳,先說

    定義cs程式安裝介面

    http://www.crifan.com/achieve_fixed_install_path_while_install_software_when_make_msi_installer/ 製作C#的msi的Installer時候,固定安裝路徑,不需要使用者選擇路徑

    使用WiX Toolset建立.NET程式釋出Bootstrapper(安裝策略管理)(二)——定義安裝

    自定義產品解除安裝方式         繼續從上一次的基礎上前進,現在我們已經知道了最簡單的bootstrapper打包方法,現在我們對其中的每個節點深入自定義,爭取可以達到我們需要的效果。先把最後全部的XML貼出來。 <?xml version="1.0" en

    mysql-5.7.18版本(二進制包安裝)-定義安裝路徑

    mysql linux lnmp mysql-5.7.18版本(二進制包安裝)-自定義安裝路徑安裝路徑:/application/mysql-5.7.181.前期準備mysql依賴libaioyum install -y libaio創建用戶mysql,以該用戶的身份執行mysqluseradd

    定義安裝apache+php+mysql+phpmyadmin

    conf sql 功能模塊 安裝apache visual pre 數據庫 html 壓縮包 apache 安裝完後訪問 http://localhost/ php 核心包(用於支持php開發 ) VC6就是legacy Visual Studio 6 compiler,就

    centos定義安裝pip3

    ans hud ttys ali 2.7 執行文件 -m 問題: jpg  題記 在之前的文章centos雲服務器安裝Python3記錄 記錄了怎麽自定義安裝 Python3 ,在後邊測試pip3的時候發現了個問題: pip --version terminal 打印:

    MFC 單文件定義exe程式左上角圖示

    我使用的是vs2012。 1、首先新建一個單文件工程 2、開啟MainFrm.cpp,在OnCreat()函式中return 0;之前新增下列語句:   TCHAR path[100];   GetCurrentDirectory(255,pa

    定義控制檯程式匯出角色對實體的許可權為Excel檔案

    本人微信公眾號:微軟動態CRM專家羅勇 ,回覆282或者20181116可方便獲取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!我的網站是 www.luoyong.me 。 先上圖讓大家看效果。許可權列沒有值則代表沒有授予這個許可權,1為個人級別,2為業務部門級別,3為上:下級業務部門

    運維 office2016定義安裝

                            office20

    定義程式popupwindow彈出框

    在上方彈出 wxml <view class="zan-dialog {{ showDialog ? 'zan-dialog--show' : '' }}"> <view class="zan-dialog__mask" bindtap=

    關於Microsoft SQL Server Management Studio定義安裝時不能更改安裝路徑或只能更改一個或兩個問題的解決

    1.首先,肯定你在裝SQLServer之前裝了VS,然後你的C盤裡面會在裡面新建了SQLServer的資料夾,所以你在後面裝SQLServer的時候只能更改一個路徑。 2.解決方法:解除安裝VS,然後再裝SQLServer,進入控制面板,然後把 這些解除安裝了(我圖片裡面

    centOS怎樣強制解除安裝PHP以及定義安裝PHP

    這個是原創的,當然也是在前人的基礎上,自己留個拷貝,其他人也不用再摸索了。 轉載請保留版權資訊謝謝:http://blog.csdn.net/21aspnet/   很無語,centOS居然php版本才5.1.6,很多開源的CMS無法安裝。 檢視php版本命令: #php

    centOS怎樣強制卸載PHP以及定義安裝PHP

    怎樣 tar.gz 安裝 ror php版本 com 過程 版權信息 www 這個是原創的,當然也是在前人的基礎上,自己留個拷貝,其他人也不用再摸索了。 轉載請保留版權信息謝謝:http://blog.csdn.net/21aspnet/ 很無語,centOS居然ph

    仿UIAlertController,製作一個定義的alert

    先放一個效果圖: 直接放程式碼 #import <UIKit/UIKit.h> typedef void(^leftBlock)(void); typedef void(^rightBlock)(void); @interface YAlertViewControlle

    製作一個定義的checkbox

    一直都不知道checkbox,radio,上傳檔案標籤的樣式怎麼去改。 和平常一樣,頁面的問題還是要去改!不多說了,心累啊!現在就說一下我是怎麼解決這個問題的。 1.這個是一開始的頁面(注意記住密碼前面的checkbox): 2.這個是最終完成後的樣式(是不是覺得瞬間高大

    inno setup軟體--教你如何製作一個漂亮的安裝程式

    當我們製作好一個課件或程式的時候就會想給它做漂亮的安裝程式,特別是用AUTHORWARE製作的課件,由於必須把XTRAS目錄下相關的檔案與可執行檔案一起提供,這時我們就需要給課件製作安裝程式。而且製作的安裝程式應該能夠進行反安裝、能在桌面放置快捷圖示、能在程式組建立組,最好

    基於安卓5.0水波紋效果製作定義水波紋顏色

    安卓5.0以後很多ui效果的改進都是為提高使用者體驗,其中水波紋效果是5.0以後是在互動方式中做的特殊處理 接下來學習一下水波紋的簡單使用及水波紋顏色的自定義。 首先佈局檔案中給控制元件設定為可點

    NSIS 定義安裝介面準確獲取安裝進度完美解決方案

     友情提醒:隨著7zip版本快速更新,nsis7z外掛已經不能全面相容新版,使用本例子請將7zip版本降至9.2x以下並下載最新版nsis7z.dll! ----------------------------------------------------------

    [office]修改office2016安裝位置,定義安裝需要的功能

    下載新版本office2016後發現安裝過程 沒有自定義安裝 預設安裝路徑在C盤 而我只需要安裝Word,PowerPoint,Excel,其他功能都用不著 C盤也快被撐爆了 步驟: 2.下載並執行微軟提供的Office2016部署工具 會生成2個檔案:    

    通過nsis和duilib實現定義安裝介面

    nsis用於實現安裝邏輯,duilib用於實現UI介面 通過nsis呼叫duilib生成的dll庫來實現。現擷取部分duilib程式碼用於展示如何使用duilib編寫程式碼。 cpp檔案如下: #include <windows.h> #i