注意:本文从旧博客迁移过来,涉及内容可能已经过时,请选择性阅读。

国内写关于WIX的资源很少,可能用户不是太多吧。大多数都比较喜欢用Inno Setup,毕竟是开源的,而且性能上也能不错。好用并不代表就必须的用它,WIX也挺不错的,最近做的一些项目都是用它来做installer,现在最新的SDK是3.5。

PS:如果不是做的MS的项目,其实我也不太喜欢用它,个人比较倾向用开源的Inno Setup。

WIX介绍

Windows Installer XML (WiX) 平台是一组工具与规范,使您能够创建 Microsoft Windows Installer 数据库文件(MSI 和 MSM)。WiX 工具承袭了根据源代码创建可执行文件所使用的传统编译和链接模型。WiX 的源代码是使用 XML 文件编写的。WiX 源代码经过预处理、编译与链接,以创建 Windows Installer 数据库。

WiX 工具集有以下两种使用方式:在代号“Rosario”的 Visual Studio Team System 中,这些工具已集成为 Visual Studio 的一部分,以便您直接在 Visual Studio IDE 中生成 WiX 项目。 您可以在命令行上使用 WiX 工具集或使用 MSBuild,来编译与链接 WiX 源代码。

如何使用来安装WS并更新?

好了,现在入正题,以下一段代码是我实现安装Windows Service以及实现对已安装的Service更新。

 <?xml version="1.0" encoding="UTF-8"?>  
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">  
 <?define BUILDTARGET="G:Win7TFSVenusSrcBRC UpdaterUpdaterClientBRCUpdaterbinRelease" ?>  
 <Product Id="1195f5eb-4a35-4259-9c26-4d069e722e49" Name="BHO Upgrade Service" Language="1033" Version="1.0.0.0"  
 Manufacturer="BHO Upgrade Service" UpgradeCode="ad16898a-76f5-40f8-a253-7cc9cc31f8c6">  
 <Package Id="*" Description="BHO Upgrade Service Installer package" Comments="This is used to upload the BRC log."  
 Manufacturer="Microsoft Corporation"  
 InstallerVersion="200" Compressed="yes"/>  
 <Upgrade Id="92430A4C-BE2B-42B6-9EAC-D0F48ED7408E">  
 <UpgradeVersion OnlyDetect="no" Property="PROJECT_UPGRADE" Maximum="1.0.0.0" IncludeMaximum="no" RemoveFeatures="all"/>  
 <UpgradeVersion OnlyDetect="yes" Property="PROJECT_DOWNGRADE" Minimum="1.0.0.0" IncludeMinimum="no"/>  
 </Upgrade>  
 <Property Id="PROJECT_UPGRADE" Secure="yes"/>  
 <Property Id="PROJECT_DOWNGRADE" Secure="yes"/>  
 <Media Id="1" Cabinet="product.cab" EmbedCab="yes" />  
 <Condition Message="You must have administrator privileges to install the application."><![CDATA[Privileged]]></Condition>  
 <Directory Id="TARGETDIR" Name="SourceDir">  
 <Directory Id="ProgramFilesFolder">  
 <Directory Id="INSTALLLOCATION" Name="BHO Update Service">  
 <Component Id="ProductComponent" Guid="06FDC340-2560-48D8-A58F-81B8833C51E1">  
 <File Id="Updater.exe" Source="$(var.BUILDTARGET)Updater.exe" />  
 <File Id="Updater.exe.config" Source="$(var.BUILDTARGET)Updater.exe.config" />  
 <File Id="TaskManager.dll" Source="$(var.BUILDTARGET)TaskManager.dll" />  
 <File Id="RoleModel.dll" Source="$(var.BUILDTARGET)RoleModel.dll" />  
 <File Id="RoleEngine.dll" Source="$(var.BUILDTARGET)RoleEngine.dll" />  
 <File Id="DownLoadEngine.dll" Source="$(var.BUILDTARGET)DownLoadEngine.dll" />  
 <File Id="Microsoft.Practices.ObjectBuilder2.dll" Source="$(var.BUILDTARGET)Microsoft.Practices.ObjectBuilder2.dll" />  
 <File Id="Microsoft.Practices.Unity.dll" Source="$(var.BUILDTARGET)Microsoft.Practices.Unity.dll"/>  
 <File Id="ExceptionHandlerProvider.dll" Source="$(var.BUILDTARGET)ExceptionHandlerProvider.dll" />  
 <RegistryKey Action="createAndRemoveOnUninstall" Root="HKLM" Key="SOFTWARESoftLab">  
 <RegistryValue Name="Name" Value="BHO" Type="string"/>  
 <RegistryValue Name="Path" Value="[INSTALLDIR]" Type="string"/>  
 <RegistryValue Name="Version" Value="2.5" Type="string"/>  
 </RegistryKey>  
 <!–<RemoveFolder Id="DeleteFolder" Directory="[INSTALLDIR]" On="uninstall"/>–>  
 <ServiceInstall  
 Id="ServiceInstaller"  
 Type="ownProcess"  
 Vital="yes"  
 Name="BHOUS"  
 DisplayName="BHO Update Service"  
 Description="This service is used to upgrade BHO."  
 Start="auto"  
 Account="LocalSystem"  
 ErrorControl="ignore"  
 Interactive="no">  
 </ServiceInstall>  
 <ServiceControl Id="StartService" Start="install" Stop="both"  
 Remove="uninstall" Name="BHOUS" Wait="yes" />  
 </Component>  
 </Directory>  
 </Directory>  
 </Directory>  
 <CustomAction Id="NoDownGrade" Error="A later version of [ProductName] is already installed." />  
 <InstallExecuteSequence>  
 <LaunchConditions After="AppSearch"></LaunchConditions>  
 <Custom Action="NoDownGrade" After="FindRelatedProducts"><![CDATA[PROJECT_DOWNGRADE]]></Custom>  
 <RemoveExistingProducts After="InstallFinalize"/>  
 </InstallExecuteSequence>  
 <Feature Id="ProductFeature" Title="BHO Update Service" Level="1">  
 <ComponentRef Id="ProductComponent" />  
 <!–<ComponentRef Id="RegistryComponent" />–>  
 </Feature>  
 </Product>  
 </Wix>  

由于它是基于XML,所以代码阅读起来不难,具体的就不用我讲了吧(参考标签),希望能帮助到你。最后推荐一个WIX的资源站:http://wix.sourceforge.net/