上一篇介绍了如何联合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>

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

Wix 安装部署(二)自定义安装界面和行为的更多相关文章

  1. Apache Hadoop集群离线安装部署(二)——Spark-2.1.0 on Yarn安装

    Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apac ...

  2. Oracle 19C的下载和安装部署(图形安装和静默安装)

    Oracle 19C的下载和安装部署(图形安装和静默安装)   https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/ ...

  3. Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本)

    Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本) Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上. 所以在安装 Hive 之 ...

  4. 修改office2019安装位置,自定义安装需要的功能

    更新:2019.5.30楼主本人本次重装系统后装office2019再次测试,没有任何问题,没认真看文章,自己胡乱一同操作,导致各种问题的,出了错就就瞎评论,说博主误导人,对你们这种人就是呵呵.左转不 ...

  5. Apache Hadoop集群离线安装部署(三)——Hbase安装

    Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apac ...

  6. zabbix的安装部署及自定义监控的实现

    此篇感谢我的小师傅. 1. Zabbix主要功能和优劣势说明 1. Zabbix主要功能和优劣势说明 1.1 Zabbix主要功能: 1)Application monitoring 应用监控 数据库 ...

  7. zabbix 3.2.5 agent端(源码包)安装部署 (二)

    一.zabbix agent 端安装部署 1.创建zabbix用户和组 groupadd zabbix useradd -g zabbix zabbix -s /sbin/nologin 2.解压za ...

  8. zabbix 3.2.2 agent端(源码包)安装部署 (二)

    一.zabbix agent 端安装部署 1.创建zabbix用户和组 # groupadd zabbix # useradd -g zabbix zabbix -s /sbin/nologin 2. ...

  9. [转]C# 应用程序安装部署步骤,安装前操作,先退出程序后卸载。

    1. 点击[文件]-[新建]-[项目]-其他项目类型-安装和部署,选择安装项目,在下面的名称栏填写SetupTest(或者选择安装向导,一直点击[下一步])2. 安装项目----六个子项依次为:文件系 ...

  10. ELK日志监控平台安装部署简介--Elasticsearch安装部署

    最近由于工作需要,需要搭建一个ELK日志监控平台,本次采用Filebeat(采集数据)+Elasticsearch(建立索引)+Kibana(展示)架构,实现日志搜索展示功能. 一.安装环境描述: 1 ...

随机推荐

  1. XidianOJ 1177 Counting Stars

    题目描述 "But baby, I've been, I've been praying hard,     Said, no more counting dollars     We'll ...

  2. 8.8 CSS知识点1

    什么是CSS CSS(Cascading Style Sheet) 层叠样式表 CSS3在CSS2的基础上增加了很多强大的新功能,目前主流浏览器都支持CSS3大部分功能.为了更好的向前兼容,不同的浏览 ...

  3. 【MVC】 异常处理

    [MVC] 异常处理 一 . 自定义 HandleErrorAttribute public class ExceptionLogAttribute : HandleErrorAttribute { ...

  4. DrawingControl控件在Add Page时报故障的问题

    Visio二次开发用到了Drawing Control控件.在控件上添加新页面时,visual编译器报内存保护故障“尝试读取或写入受保护的内存.这通常指示其他内存已损坏.”,这个问题困扰了我很久,最后 ...

  5. UI组件之Group

    当Group旋转或缩放时,它的孩子们正常绘制,并且Batch变换后正确的旋转或缩放. 绘制Group前,Batch flush使得变换可以设置.有很多Group时这将可能成为性能瓶颈.如果在一组演员不 ...

  6. Spring----->projects----->Spring Security

    1.Spring Security概述 Spring Security是spring社区若干projects中的一个 Spring Security用于为基于spring开发的application提 ...

  7. [原创]Spring MVC 学习 之 - URL参数传递

    原文参考地址: http://www.cnblogs.com/rhythmK/p/3971191.html 目的和缘由: 本人想做一个分享的页面,分析给朋友注册,注册按分享ID进行级联; 过程: 很多 ...

  8. Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例

    match.search.findall.group(s) 区别 import re # match findall经常用 # re.match() #从开头匹配,没有匹配到对象就返回NONE # r ...

  9. ajax 调用 JSON.parse();

    $.ajax({           type : "POST",           data:{            createStartTime:createStartT ...

  10. SQL Server 存储过程自定义生成ID号

    * FROM sys.tables WHERE name=N'EmployeeNo_Identity') DROP TABLE EmployeeNo_Identity GO CREATE TABLE ...