继续学习WIX

转载 2007年09月17日 19:55:00

WiX(Windows Installer XML)是Rob Mensching(Windows组的一个SDE)写的一个用来编写MSI安装包的工具集,已经被微软内部的很多产品组采用,例如Office组,以及我所在的MSN组,等等。

下面是WiX的一个简单例子(相当于高级的Hello World!的级别),在这个例子中编写了一个SimpleCopy.msi。安装SimpleCopy.msi将能够:

  • 创建C:/Program Files/SimpleCopy目录并拷贝一系列文件;
  • 创建HKEY_LOCAL_MACHINE/SOFTWARE/MPG Lab注册表键,该键下的DestPath变量存储了一个文件路径,DestPath可以在msiexec命令行中用DESTPATH来指定;
  • 创建名为SimplyCopy的Scheduled Task,该任务每小时运行一次,执行C:/Program Files/SimpleCopy/SimpleCopy.exe,将该目录下data/source.xml拷贝到DestPath中指定的目录;
  • Uninstall时,安装时拷贝的文件、创建的注册表键和Scheduled Task都将被删除。

下面就是用WiX编写SimpleCopy.msi的步骤:

1. 从http://sourceforge.net/projects/wix下载wix的2.0.3220.0版本并解压到硬盘,将candle.exe所在的路径添加到Path环境变量中;
2. 用C#编写SimpleCopy.cs并用csc.exe在同一目录下编译成SimpleCopy.exe:

using System; using System.IO; using System.Reflection; using Microsoft.Win32; namespace SimpleCopy { internal class Application { [STAThread] private static void Main(string[] args) { string sourcexml = GetExecutableLocation() + @"/data/source.xml"; if (File.Exists(sourcexml)){ DateTime now = DateTime.Now; File.Copy(sourcexml, Application.QueryDestPath() + @"/source_" + now.ToString("yyMMdd_HH.mm.ss") + ".xml", true); } else{ StreamWriter writer = new StreamWriter(QueryDestPath() + @"/error.log", false); writer.WriteLine(DateTime.Now.ToString()); writer.WriteLine("Cannot find source file: " + sourcexml); writer.Close(); } } private static string QueryDestPath() { RegistryKey regkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/MPG Lab"); if (regkey != null){ object obj = regkey.GetValue("DestPath"); if (obj != null){ return obj.ToString(); } } if (false == Directory.Exists(GetExecutableLocation() + @"/regkey_not_found")){ Directory.CreateDirectory(GetExecutableLocation() + @"/regkey_not_found"); } return (GetExecutableLocation() + @"/regkey_not_found"); } private static string GetExecutableLocation() { return Directory.GetParent(Assembly.GetEntryAssembly().Location).ToString(); } } }

3. 在SimpleCopy.cs同一目录下创建"data"子目录,在data/下创建一个任意内容的source.xml;
4. 在SimpleCopy.cs同一目录下编写SimpleCopy.wxs,其Schema文件wix.xsd可以在wix下载解压后的doc目录中找到。SimpleCopy.wxs内容如下:

xml version='1.0'?> <Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'> ='c859431f-086d-4840-b2d7-a84b3bce50f2' Name='SimpleCopy' Language='1033' Version='1.0.0.0' Manufacturer='MPG China'> <Package Id='2738eb03-978b-4712-8e21-7e1868c74c2f' InstallerVersion='200' Compressed='yes' /> <Property Id='DESTPATH' Value ='C:/'/> ='1' Cabinet='product.cab' EmbedCab='yes' /> <Directory Id='TARGETDIR' Name='SourceDir'> ='ProgramFilesFolder' Name='PFiles'> ='AppDirectory' Name='SimpleCp' LongName='SimpleCopy'> ='ExecutableFile' DiskId='1' Guid='379ccaeb-a8c9-448e-a4b3-fa9884676492'> ='SimpleCopy_exe' Name='SimpleCp.exe' LongName='SimpleCopy.exe' src='SimpleCopy.exe' /> Component> <Directory Id='DataFolder' Name='data'> ='SrcXml' DiskId='1' Guid='746496f1-d2b1-4334-9b6f-00f71938c459'> ='Source_xml' Name='source.xml' src='data/source.xml' /> <Registry Id='4e10403a-1976-447f-b38c-59839cb7c5cb' Root='HKLM' Type='string' Key='SOFTWARE/MPG Lab' Name='DestPath' Value ='[DESTPATH]'/> > Directory> Directory> Directory> Directory> <Feature Id='AllFiles' Title='Simple Copy All Files' Level='1'> ='ExecutableFile' /> <ComponentRef Id='SrcXml' /> Feature> <InstallExecuteSequence> <Custom Action='CreateScheduleTask' After='InstallFinalize'>NOT Installed> <Custom Action='DeleteScheduleTask' After='InstallFinalize'>Installed > <Property Id='SCHTASKS'>SCHTASKS.exe ='CreateScheduleTask' Property='SCHTASKS' ExeCommand='/Create /RU "" /SC HOURLY /TN SimplyCopy /TR "%ProgramFiles%/SimpleCopy/SimpleCopy.exe"'/> <CustomAction Id='DeleteScheduleTask' Property='SCHTASKS' ExeCommand='/Delete /TN SimplyCopy /F'/> Product> Wix>

5. 打开命令行,进入SimpleCopy.cs所在的目录,先后运行candle SimpleCopy.wxs以及light SimpleCopy.wixobj,然后就得到SimpleCopy.msi了:

6. 在命令行运行“msiexec /i SimpleCopy.msi /quiet /log log.txt DESTPATH=d:/”就可以安装了。

相比较其他MSI编写工具(例如Visual Studio 2003/2005,以及InstallShield等),WiX的优点是:

  1. 便于版本控制(wxs是纯文本的);
  2. 便于自动化(编辑工具candle.exe和light.exe都是命令行的)。
 

Wix学习(十一)

Wix 升级和打包 如何选择一个合适的升级的类型 major upgrade 最简单,它就是一个完整的MSI,就像另一个安装包一样,包含原来安装包的所有内容,唯一不同它检测 一...
  • superliuxing
  • superliuxing
  • 2012年11月22日 17:08
  • 654

wix 知识总结及范例

wix知识总结
  • zhuoyue008
  • zhuoyue008
  • 2016年11月18日 14:50
  • 472

Wix学习笔记(一)

Title:Wix学习笔记 Date: 2015-05-18 Environment: VS2013Update4、Win7SP1、WinXPSP3、WiX Toolset v3.9 R2 内容简...
  • lee353086
  • lee353086
  • 2015年05月19日 15:28
  • 2544

Wix 学习 (十二)

如何使用命令行来编译链接
  • superliuxing
  • superliuxing
  • 2014年06月28日 15:29
  • 389

Wix学习整理(1)——快速入门HelloWorld

1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Installer安装包数据库的元素。关于Wix的详细介绍,查看W...
  • dssxk
  • dssxk
  • 2013年08月20日 17:55
  • 665

WIX学习(十七)

如何一个按钮触发两个事件?     Default="yes" Cancel="yes" Text="[ButtonText_Finish]">     1     (NOT Install...
  • superliuxing
  • superliuxing
  • 2014年06月30日 01:24
  • 408

WIX学习(十五)

Condition Message="You need to be an administrator to install this product."> AdminUser Condition>
  • superliuxing
  • superliuxing
  • 2014年06月28日 20:51
  • 409

初学wix遇到的问题以及解决方案

首先得问题就是会在下载过wix toolset之后(需要设置环境变量,也就是把你的wix toolset 的bin的路径放到环境标量中),打开vs发现项目下并没有出现windows install x...
  • baidu_33398481
  • baidu_33398481
  • 2016年08月11日 10:17
  • 1002

WIX 学习(十六)

对于Control里面 EndDialog这种event的处理, value 可以为re
  • superliuxing
  • superliuxing
  • 2014年06月30日 01:01
  • 333

【C#】WixToolset快速入门教程

介绍给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield、Inno setup等。在遇见Wix之前InstallShield时我的主力打包工具,操作简单...
  • catshitone
  • catshitone
  • 2017年09月02日 17:11
  • 1073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:继续学习WIX
举报原因:
原因补充:

(最多只允许输入30个字)