使用Advanced Installer製做IIS安裝包(二:配置安裝包依賴項和自定義dll)

前言:上篇使用Advanced Installer製做IIS安裝包(一:配置IIS和Web.config)介紹了下使用Advanced Installer配置IIS和Web.config的過程,操做起來是相對比較簡單的,只要知道了博主提供的方法,相信都不是問題,其實博主當初尋找相關方法配置IIS和Web.config的時候也是費了九牛二虎之力的,畢竟資料太少,只能各類方式挨個嘗試一遍,解決問題以後回過頭來看,發現當初也是走了不少的彎路。好比今天要介紹的這個自定義dll的功能。html

關於安裝包的製做,可能有人以爲沒啥叼用,直接將發佈的文件拷貝過去,而後再IIS上面新建站點,配置一下相關的選項就好了唄,哪至於像你說的這麼複雜!確實,直接配置沒有任何問題,但當你的產品作大了以後,總不能每一次部署都遠程到客戶的服務器上面操做一番吧,而且不少客戶是不肯意讓你去登錄他的服務器的,這種狀況下直接丟一個exe給別人安裝是否是更加方便呢?退一步說,哪怕是爲了讓咱們的系統看上去高大上也行嘛~~web

本文原創地址:http://www.cnblogs.com/landeanfen/p/6369192.htmlsql

1、配置安裝包依賴項

Advanced Installer支持直接在安裝包中包含.net Framework,這樣在安裝軟件的時候會檢測你的PC上面是否安裝了對應的framework的版本,若是沒有,則會自動給你安裝Framework。而且支持離線和在線兩種方式的安裝。數據庫

進入到Prerequisites菜單瀏覽器

選擇須要包含的framework的版本,好比博主這裏選擇4.6.1,支持在線和離線兩種方式。若是你選擇離線,須要先將framework 4.6.1的安裝包下載到本地,而後包含進來;若是是在線安裝,則須要提供framework 4.6.1的在線下載地址。好比若是是在線安裝,添加成功以後會是這樣:服務器

須要說明的是,若是是離線安裝,那咱們生成的安裝包裏面會包含framework的安裝包,那麼勢必會致使安裝包過大(好比博主這裏包含以後差很少有100M左右);若是是在線安裝,必須保證安裝環境可以鏈接互聯網。因此,具體選擇哪一種方式能夠根據實際狀況來決定。oracle

除了支持包含framework之外,Advanced Installer還支持容許安裝軟件檢測系統的版本,好比:ide

這裏勾選的系統版本即爲安裝必須的系統版本,這個很簡單,有興趣的能夠試試。post

除此以外,Advanced Installer還支持安裝的時候檢測機器上面的瀏覽器版本、sql  server數據庫版本、IIS版本等選項。若是當前安裝機器上面的版本低於要求的配置,就會提示錯誤。測試

2、自定義dll(測試數據庫鏈接)

關於自定義dll這個,博主曾經嘗試過很長時間,發現裏面有幾個坑。且聽博主慢慢道來。

下面博主就以配置Web.config裏面的鏈接字符串爲例來講明安裝過程當中自定義dll的使用。好比,咱們拖出以下界面:

而後四個文本框的屬性名分別爲EDIT_1_PROP_一、EDIT_2_PROP_一、EDIT_3_PROP_一、EDIT_4_PROP,爲了簡便,這裏就不改這個名稱了。而後咱們是但願在安裝過程當中,將用戶填寫的文本框的值寫入到Web.config的Connectionstring裏面。而後咱們找到自定義操做

咱們新建一個.net操做類,它會提示你使用哪一個dll。咱們先將預先定義好的一個Mes.Installer.dll添加進來,而後來看這個dll裏面的代碼。

首先在VS裏面新建一個類庫項目Mes.Installer,而後新建一個安裝程序類

繼承System.Configuration.Install.Installer類,重寫Install()方法。

在介紹Install()方法的實現以前,還須要說明一下Advanced Installer裏面的變量的值如何傳到咱們的C#程序裏面來,上篇咱們說過,Advanced Installer裏面使用[]來定義變量,那麼這個變量如何傳入C#程序呢?咱們找到Advanced Installer裏面有一個Intaller Class Parameters(安裝類參數)

咱們新建一個參數,好比:

[EDIT_1_PROP_1]表示Adavanced Installer裏面的文本框的屬性,dataSource就對應C#裏面參數。咱們用一樣的方法定義另外幾個參數:

注意,若是要在C#裏面讀取安裝文件的根目錄,須要這麼定義變量

有了這個做爲基礎,咱們就能夠來看看Install()方法了

     public override void Install(IDictionary stateSaver)
        {
            var path = Context.Parameters["target"].ToString();
            if (!Directory.Exists(path))
            {
                base.Install(stateSaver);
                return;
            }
            //1.獲得配置文件的物理路徑
            var configPath = path + "Web.config";

            //2.取參數
            var dataBaseType = Context.Parameters["dataBaseType"].ToString();
            var dataSource = Context.Parameters["dataSource"].ToString();
            var server = Context.Parameters["server"].ToString();
            var userId = Context.Parameters["userId"].ToString();
            var password = Context.Parameters["password"].ToString();
            //var config = WebConfigurationManager.OpenWebConfiguration(configPath);
            //3.寫xml
            var config = XDocument.Load(configPath);
            var connectionStrings = config.Element("configuration").Element("connectionStrings");
            string connectionString, providerName;

            connectionString = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", dataSource, server, userId, password);
            providerName = "System.Data.SqlClient";
            
            var adds = connectionStrings.Elements("add");
            foreach (var add in adds)
            {
                if (add.Attribute("name").Value == "Entities")
                {
                    add.Attribute("connectionString").Value = connectionString;
                    add.Attribute("providerName").Value = providerName;
                    break;
                }
            }
            config.Save(configPath);

            //4.調用父類的Install()方法
            base.Install(stateSaver);
        }

注意這裏有一個坑:以前按照園子裏的一篇文章來操做,將 base.Install(stateSaver); 這一句放在Install()方法的最前面,最後發現安裝的時候怎麼都執行不了本身寫的代碼,就爲這博主折騰了好久。

若是你看過博主上篇文章,你可能會疑惑,若是僅僅是配置鏈接字符串,直接在Advanced Installer裏面經過變量的形式配置xml也是同樣啊。好比

這樣配置不是更加簡單嗎?若是你有這樣的疑惑,說明你是一個用心的讀者,爲你點個贊!確實,這樣也能解決鏈接字符串的問題,由於博主的項目裏面須要區分sql server數據庫和oracle數據庫,因爲不一樣的數據庫類型在web.config裏面的鏈接字符串的形式不一樣,因此博主使用了dll的方式來操做。而且,在一些特定的狀況下,咱們使用dll的方式可以更加方便地和咱們的系統打交道,好比咱們須要在安裝的時候去初始化系統的一些配置,這些時候使用dll的優點就凸顯了。

關於數據庫的配置,還有一點是值得一提的,那就是咱們的Advanced Installer支持在安裝的過程當中測試數據庫鏈接。仍是在dialog裏面Add dialog...,

肯定以後以下

這樣,咱們在安裝的過程當中,組件會自動檢測咱們系統的sql Server實例,咱們輸入用戶名密碼以後,點擊「Test Sql Connection」按鈕,能夠檢測是否鏈接成功。

以上是針對sql server的,對於oracle數據庫的測試連接,就略顯複雜,須要配置ODBC相關的選項。暫且不展開說了,看看園友們對這塊有沒有需求。

3、總結

好了,關於IIS安裝包的製做暫且告一段落,但願對你們有幫助。

若是你以爲本文可以幫助你,能夠右邊隨意 打賞 博主,也能夠 推薦 進行精神鼓勵。你的支持是博主繼續堅持的不懈動力。

本文原創出處:http://www.cnblogs.com/landeanfen/

歡迎各位轉載,可是未經做者本人贊成,轉載文章以後必須在文章頁面明顯位置給出做者和原文鏈接,不然保留追究法律責任的權利

相關文章
相關標籤/搜索