Wix 安裝部署(二)自定義安裝界面和行為


       上一篇介紹了如何聯合MSBuild來自動生成打包文件和對WIX的一些初步認識,http://www.cnblogs.com/stoneniqiu/p/3355086.html 。

        這篇會在上篇的基礎上繼續探索Wix的自定義界面和行為的功能,以下都是個人的小結,不當之處歡迎指正,與君共勉!

一、安裝向導

       Wix提供了五種安裝向導風格,

  •  WixUI Advanced
  •  WixUI FeatureTree
  •  WixUI InstallDir
  •  WixUI Minimal
  •  WixUI Mondo

    如何使用呢?需要兩步,先不問為什么:

    1.需要使用UIRef 元素  ,在Product中引入

  <UI> <UIRef Id="WixUI_Minimal" /></UI>

 

   2.再在安裝工程上右鍵添加引用,引入WixUIExtension.dll ,這個dll就在你安裝的wix的bin目錄下面。我們再生成以下,這個時候點擊安裝文件,安裝向導頁面就出現了,先是同意許可證,再是上一步,下一步等按鈕知道完成,比上一篇中的安裝明顯像樣了些。先不着急往下走,再回頭看以下 

     UI元素是專門用來規范安裝UI的,在其中可以定義你選擇的風格,設置自定義的行為等。UIRef 用來選擇安裝向導風格,把Id中Minmal換掉就可以了,Minmal是最簡潔的。當然不能出現兩個UIRef,不然WIx就凌亂了。

   Advance和InstallDir 還需要其他的設置。

    InstallDir 需要一個屬性,讓用戶定義安裝的地方。如下:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="TESTFILEPRODUCTDIR" Name="Test File">
      ...
    </Directory>
   </Directory>
</Directory>
...
<Property Id="WIXUI_INSTALLDIR" Value="TESTFILEPRODUCTDIR" />
<UIRef Id="WixUI_InstallDir" />

   當然要記得修改 

<ComponentGroup Id="ProductComponents" Directory="TESTFILEPRODUCTDIR"> 

   安裝的時候,就會讓用戶選擇安裝位置。

   

     WixUIExtension.dll是wix自帶的鏈接庫,還有其他的鏈接庫如WixUtilExtension,WixNetFxExtension,WixIISExtension等,會在后面一一探索。

二、自定義風格

    這里主要講的是加入自己的文字和圖片,默認的是帶有Wix的一些背景圖片,正式發布的時候,當然要換成自己產品相關的。

    1.修改許可證書。許可證書需要rtf的富文本格式,我們可以用word先把內容寫好,然后文件另存為選擇rtf格式的保存就行了,再直接粘貼到工程目錄下。然后在Product標簽中加入以下代碼,license.rtf就是你的許可證書。再次生成,安裝的時候就在第一頁看到了。

  不要直接修改后綴,要用word轉換,不然會不顯示或者報錯

    <WixVariable Id="WixUILicenseRtf" Value="license.rtf" />

 

 WixVariable是wix比較先進的個功能,Value不能為空。同樣我們可以換掉圖片及其他。WixUIDialogBmp的圖片會出現在歡迎頁和安裝完成頁,規格是 493 × 312

WixUIBannerBmp 的圖片會出現正上方。規格493 × 58,用bmp格式 xp才會顯示正常。也不要直接改后綴,用圖片處理軟件轉換。  

 <WixVariable Id="WixUIDialogBmp" Value="bb.bmp"/>
 <WixVariable Id="WixUIBannerBmp" Value="top.bmp"/>

還有WixUIInfoIco,WixUINewIco,WixUIUpIco,WixUIExclamationIco 來更換一些圖標。

 2.定義退出頁。

  ExitDlg 成功安裝后顯示,可以加入文字,復選框,讓用戶選擇是否馬上執行,我們在安裝軟件的時候經常看到這個提示。

  我們先加入一條感謝語,在Product元素中插入以下內容,WIXUI_EXITDIALOGOPTIONALTEXT 專門用來展示文字。

<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Thank you for installing this product." />

 同理加入一個復選框,用來提示用戶運行是否當前程序。

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch My Application Name" />

界面讓我改成這個樣子了,覺得這個背景透明度也是個問題,這個問題先記下。

 但這個時候 還是不能運行的,我們再看下一節。

三、執行自定義Action

  這里小小的分開下,是因為Action是wix中的一大功能,這次先嘗下滋味。需要三步

  1.先引入WixUtilExtension.dll 

  2.用WixShellExecTarget 和 CustomAction來定義這個行為 (在Product元素中加入)

<Property Id="WixShellExecTarget" Value="[#myapplication.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

 WixShellExecTarget 是專門用來運行一個應用程序的,這里的Value中的#號表示的是全路徑,而這個myapplication.exe是個id,指向你安裝組件的中File的id。相當於這個Property定義了要執行程序的位置。CustomAction定義了這個行為Id就是LanuchApplication,DllEntry表示是入口。深入的認識還是要到后面繼續研究。

 3.在UI元素中加入Publish元素來告訴UI如何執行這個行為。

  <UI>
    <UIRef Id="WixUI_Minimal" />
    <Publish Dialog="ExitDialog"
    Control="Finish" 
    Event="DoAction" Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
  </UI>

 上面兩個元素完成了方法的定義,這里的Publish就是觸發這個行為。Dialog屬性表示是哪個框(dialog),Control=“Finish” 表示是點擊完成鍵觸發這個行為,Event=“DoAction” 表示點擊后執行這個行為,應該還有其他的值,現在還不知道。而這個Value 正好指向了CustomAction的Id。 WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 表示要checkbox 選中后執行。於是乎,仿佛碎片的世界又聯系在了一起。這個時候,我們重新生成后,安裝一遍,選擇復選框,就能執行了。回頭想想,為什么是這樣,wix這個相當於全部都是配置文件,不像C#的語言那么優雅,語義化。所以開始看起來確實有些惱火呢。理解了才能記得住,每個元素就相當於一張表,而這個Id對於每個元素來說都是唯一的,這樣通過Value和Id彼此關聯,而且生產MSI文件其實就是個數據庫。

 如果要立即執行某個程序,比如bat文件 可以將這個行為加到安裝序列中執行

   <CustomAction Id='LaunchFile' FileKey='installdog' ExeCommand=''  Return='asyncNoWait' />
    <InstallExecuteSequence>
      <Custom Action='LaunchFile' After='InstallFinalize'>1</Custom>
    </InstallExecuteSequence>
    <File Source='$(var.Dev)HMIRun\SenseLockDrivers\install.bat' Id='installdog' KeyPath='yes' />

 如果要立即執行某個程序。

<CustomAction Id='LaunchDog'    FileKey='install.bat' ExeCommand=''  Execute="immediate"  Impersonate="yes"  Return="asyncNoWait" />

<InstallExecuteSequence>
      <Custom Action='LaunchDog'   After='InstallFinalize'   >1</Custom>
    </InstallExecuteSequence>

fliekey指向的是一個bat文件,但奇怪的是,直接運行這個bat瞬間就執行完了,在安裝過程中執行卻要個10秒鍾,推測是因為 After='InstallFinalize' 等待整個安裝完成,但是我修改成其他的InstallExecuteSequence中的行為,卻沒有觸發安裝,在卸載的時候卻安裝了。

還有一種方法,靜默的觸發bat文件。不會彈出黑色的框。

    <CustomAction Id="service_start_cmd" Property="QtExecCmdLine" Value="&quot;[dirAD8BC174523EABBBEA5FE139FD0C5127]install.bat&quot;"/>
    <CustomAction Id="service_start" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="check" />
    <InstallExecuteSequence>
      <Custom Action="service_start_cmd" After="InstallFinalize" Overridable="yes">NOT Installed</Custom>
      <Custom Action="service_start" After="service_start_cmd" Overridable="yes">NOT Installed</Custom>
    </InstallExecuteSequence>

不過windows系統在非管理員下 又會彈出提示:正在安裝這個驅動。。。 這個驅動是否正確安裝。  雖然比黑框好了一點,但還是不完美。

 

四、定義文字

 所有安裝過程中的文字都是可以重載的, 可以通過增加一個String 指定對應的Id 就可以重載,這個可以用來做一個分離工作。需要兩步

  1.需要加入localization  文件,右鍵,添加新建項,選擇localization File . 再用String 來定義你的文字。

<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
    <String Id="ApplicationName">**My Application Name</String>
        <String Id="ManufacturerName">My Manufacturer Name</String>
</WixLocalization>

  2.修改你的Product.wxs ,這里的Name 后的表達式就指向localization文件中的Id="Application" 的String。 

<Product Id="*" Name="!(loc.ApplicationName)" .......

    再次安裝的時候文件名就變成了**My Application Name,其他地方同理。這樣可以避免多次重復的修改,做到文字和配置的分離。

    這一節先到這里,今天眼睛都看花了,自定義的還不止這些,明天繼續.....

 全部代碼:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="!(loc.ApplicationName)"
   Language="1033" Version="1.0.0.0" Manufacturer="RJStone" UpgradeCode="3486eddf-0957-45cf-8c26-3de8bceca2b4">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />

        <Feature Id="ProductFeature" Title="Setup07" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
  
  <UI>
    <UIRef Id="WixUI_Minimal" />
    <Publish Dialog="ExitDialog"
    Control="Finish" 
    Event="DoAction" 
    Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
  </UI>
 
    <WixVariable Id="WixUILicenseRtf" Value="lisences.rtf" />
    <WixVariable Id="WixUIDialogBmp" Value="bb.jpg"/>
    <WixVariable Id="WixUIBannerBmp" Value="top.jpg"/>
    
    <Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Thank you for installing this product." />
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch this Application " />
      
    <Property Id="WixShellExecTarget" Value="[#myapplication.exe]" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

 
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="Setup07" />
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
            <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
            <!-- <Component Id="ProductComponent"> -->
                <!-- TODO: Insert files, registry keys, and other resources here. -->
      <Component Id="ProductComponent">
        <File Id="myapplication.exe"  Source="$(var.MyApplication.TargetPath)" />
      </Component>
    </ComponentGroup>
    </Fragment>
</Wix>
View Code

 

    還是那句話,如果對你有幫助,就頂一下吧

 


免責聲明!

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



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