首页 > 其他分享 >Wix 安装部署(二)自定义安装界面和行为

Wix 安装部署(二)自定义安装界面和行为

时间:2022-12-06 10:11:39浏览次数:61  
标签:这个 定义 自定义 行为 安装 Id 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>
复制代码

 

    还是那句话,如果对你有帮助,就顶一下吧

标签:这个,定义,自定义,行为,安装,Id,Wix
From: https://www.cnblogs.com/CS-ComputerScience/p/16954409.html

相关文章

  • Android(Lollipop/5.0) Material Design(六) 自定义动画
    官网地址:https://developer.android.com/intl/zh-tw/training/material/animations.html动画在Material设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性。M......
  • Android 自定义组件之如何实现自定义组件
    简介Android提供了用于构建UI的强大的组件模型。两个基类:View和ViewGroup。可用Widget的部分名单包括Button,TextView,EditText,ListView,CheckBox,RadioButton,Gallery,Spin......
  • C++入门(一)----Visual C++ 6.0和Visual Studio 2019 的安装与使用
    VisualC++6.0的安装与使用VisualStudio2019的安装与使用下载链接:​​​https://visualstudio.microsoft.com/zh-hans/free-developer-offers/​​​VisualStudio201......
  • Android 自定义标题栏Title Bar
    在Android自定义标题栏,步骤很简单:1.在onCreate方法中声明如下代码:requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);setContentView(R.id.activity_main);getWindow().......
  • helm kibana 8.5.1 安装
    helm应用名使用kibana清除命令kubectldeleteconfigmapkibana-kibana-helm-scripts-nelastickubectldeleteserviceaccountpre-install-kibana-kibana-nelastic......
  • K8S集群搭建二进制安装
    第一章     安装前必读本文档适用于k8s1.17+请不要使用带中文的服务器和克隆的虚拟机请将该文档复制一份,然后进行更改安装,并记录每一个步骤的返回信息,有问题可......
  • 使用 gvm 来快速安装或者升级 golang 版本
    gvm是golang的版本管理工具,有点类似于python的pyenv。一、安装gvmbash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gv......
  • prometheus安装
    1、下载安装包https://prometheus.io/download/2、解压安装包tar-xvfprometheus-2.37.4.linux-amd64.tar.gz3、做软连接,指定自己的解压的目录ln-sv/root/prometheus/pr......
  • 服务器上kafka单机版安装以及shell简单测试
    在Kafka2.8之后,引入了基于Raft协议的KRaft模式,支持取消对Zookeeper的依赖。在此模式下,一部分KafkaBroker被指定为Controller,另一部分则为Broker。这些Controller的作用就......
  • Linux Debian11使用Podman安装DVWA靶场环境
    一、DVWA靶场环境简介​1.DVWA一个用来进行安全脆弱性鉴定的PHP/MySQLWeb应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用......