I have a WiX Project created in Visual Studio 2017 with a CustomDialog, a variable file, a localization file and a Product.wxs with the following structure. In the Project, I have added two dll references (WixUIExtension and WixUtilExtension). I have 4 folders added to the project.
Binary, 1.0.0, 1.0.1 and Localization.
The following are the contents inside the folders.
Binary folder has Sample.ico, TestWinSvc.exe TestWinSvc.exe.config files.
1.0.0 folder has Manual.pdf and Sample.txt files
1.0.1 folder has Sample.txt (the contents of this are different from the one in 1.0.0)
Localization folder has en-us.wxl
The contents of the en-us.wxl are as follows.
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us"
xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="LANG">1033</String>
<String Id="ProductName">Sample MSI Product(EN-US)</String>
<String Id="InstallFolderName">MSI Sample(EN-US)</String>
</WixLocalization>
The project also has the following files.
License.rtf (a sample license file) Product.wxs ServiceAccountDlg.wxs Variables.wxi
The following are the contents of each file.
Product.wxs has the following code
<?xml version="1.0" encoding="UTF-8"?>
<?include Variables.wxi ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>
<Product Id="$(var.ProductCode)" Name="$(var.ProductName)" Language="!
(loc.LANG)" Version="$(var.ProductVersion)" Manufacturer="MyCompany"
UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes"
InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is
already installed." />
<Condition Message='This application only runs on Windows 7 or higher OS
versions.'>
<![CDATA[Installed OR (VersionNT64 >= 601)]]>
</Condition>
<MediaTemplate />
<Property Id="MSIFASTINSTALL" Value="1"/>
<Property Id="MsiLogging" Value="v" />
<Property Id="INSTALLDIR">
<RegistrySearch Id='MSISampleRegistry' Type='raw' Root='HKLM'
Key='SOFTWARE\MyCompany\App' Name='INSTALLDIR' Win64='yes' />
</Property>
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
<Feature Id='Complete' Title='Foobar 1.0' Description='The complete
package.'
Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'
AllowAdvertise='no' InstallDefault='local' Absent='disallow'>
<Feature Id="ProductFeature" Title="SampleMSI" Level="1"
AllowAdvertise='no' InstallDefault='local' Absent='disallow'
Display='expand'>
<ComponentRef Id="ProductComponent"/>
<ComponentRef Id="ServiceComponent"/>
<ComponentRef Id="RegistryComponent"/>
<ComponentRef Id="deleteFolder"/>
</Feature>
<Feature Id='Documentation' Title='Description' Description='The
instruction manual.' Level='2' AllowAdvertise='no'
InstallDefault='followParent' Absent='disallow'>
<ComponentRef Id='Manual' />
</Feature>
</Feature>
<!--<UIRef Id="WixUI_Mondo"/>
<UIRef Id="WixUI_ErrorProgressText" />-->
<UI Id="MyWixUI_Mondo">
<UIRef Id="WixUI_Mondo" />
<DialogRef Id="ServiceAccountDlg" />
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog"
Value="ServiceAccountDlg" Order="2">LicenseAccepted = "1"</Publish>
<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog"
Value="ServiceAccountDlg">1</Publish>
</UI>
<UIRef Id="WixUI_ErrorProgressText" />
<Icon Id="Sample.ico" SourceFile="Binary\Sample.ico" />
</Product>
<Fragment>
<Component Id='Manual' Guid='7470A2CD-B07C-4AB4-9152-8C6AA53FA0F7'
Directory='INSTALLDIR'>
<File Id='Manual' Name='Manual.pdf' DiskId='1'
Source='$(var.ProductVersion)\Manual.pdf' KeyPath='yes'>
<Shortcut Id="startmenuManual" Directory="DesktopFolder"
Name="Instruction Manual" Advertise="yes" />
</File>
</Component>
</Fragment>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="$(var.InstallFolderName)" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="CommonAppDataFolder">
<Directory Id="TestInstallerLogs" Name="TestInstallerLogs">
<Component Id="deleteFolder" Guid="323549D2-90B7-4D5D-8A36-
EEA0ACCCC35E">
<RemoveFile Id="deleteServiceFile" Name="TestWinSvcLog.txt"
On="both" Directory="TestInstallerLogs"/>
<RemoveFolder Directory="TestInstallerLogs"
Id="TestInstallerLogs" On="both"/>
</Component>
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<Component Id="ProductComponent" Directory="INSTALLDIR">
<File Id="SampleTextFile.txt" Name="Sample.txt"
Source="$(var.ProductVersion)\Sample.txt" KeyPath="yes">
<Shortcut Id="startmenuSampleText" Directory="DesktopFolder"
Name="MSI Sample" WorkingDirectory='INSTALLDIR' Icon='Sample.ico'
Advertise='yes' />
</File>
</Component>
</Fragment>
<Fragment>
<Component Id='ServiceComponent' Directory="INSTALLDIR">
<util:User Domain="[DOMAIN]" Id="svcUser" Name="[USER_NAME]"
Password="[PASSWORD]" LogonAsService="yes"/>
<File Id='testWinSvc' Name='TestWinSvc.exe'
Source='Binary\TestWinSvc.exe' KeyPath='yes' />
<ServiceInstall Id="installTestWinSvc" Name="TestWinSvc"
DisplayName="Install Test Windows Service" Start="auto"
ErrorControl="normal" Type="ownProcess" Account="[DOMAIN]\[USER_NAME]"
Password="[PASSWORD]" />
<ServiceControl Id="sc_TestWinSvc" Name="TestWinSvc" Start="install"
Stop="both" Remove="uninstall" Wait="yes" />
<ServiceControl Id="stopAndStartIIS" Name="IISADMIN" Start="uninstall"
Stop="install" Wait="yes" />
<ServiceControl Id="stopAndStartSQL" Name="MSSQLSERVER"
Start="uninstall" Stop="install" Wait="yes" />
</Component>
</Fragment>
<Fragment>
<Component Id="RegistryComponent" Directory="INSTALLDIR">
<RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]'
Type='string' Value='' KeyPath='yes' />
</Component>
</Fragment>
</Wix>
ServiceAccountDlg.wxs has the following code
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="ServiceAccountDlg" Title="Service Account Credentials"
Width="370" Height="270" NoMinimize="yes">
<Control Id="lblDomain" Type="Text" X="45" Y="35" Width="100"
Height="15" TabSkip="no" Text="&Domain:" />
<Control Id="txtDomain" Type="Edit" X="45" Y="50" Width="220"
Height="18" Property="DOMAIN" Text="{80}" />
<Control Id="lblUserName" Type="Text" X="45" Y="73" Width="100"
Height="15" TabSkip="no" Text="&User Name:" />
<Control Id="txtUserName" Type="Edit" X="45" Y="85" Width="220"
Height="18" Property="USER_NAME" Text="{80}" />
<Control Id="lblPassword" Type="Text" X="45" Y="110" Width="100"
Height="15" TabSkip="no" Text="&Password:" />
<Control Id="txtPassword" Type="Edit" Password="yes" X="45"
Y="122" Width="220" Height="18" Property="PASSWORD" Text="{80}" />
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56"
Height="17" Text="&Back">
<Publish Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
</Control>
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56"
Height="17" Default="yes" Text="&Next">
<Publish Event="SpawnWaitDialog"
Value="WaitForCostingDlg">CostingComplete = 1</Publish>
<Publish Event="NewDialog" Value="SetupTypeDlg"></Publish>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56"
Height="17" Cancel="yes" Text="Cancel">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
</Dialog>
</UI>
</Fragment>
</Wix>
Variables.wxi has the following code.
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define ProductCode = "21080224-9B1A-46D7-8560-2760B8E429DD" ?>
<?define UpgradeCode = "BFF39007-24DC-4F27-AF79-A3D99DC58FB9" ?>
<?define ProductName = "!(loc.ProductName)" ?>
<?define InstallFolderName = "!(loc.InstallFolderName)" ?>
<?define ProductVersion = "1.0.0" ?>
<?define ProductURL = "http://mycompany.com/products/1/" ?>
<?define BinaryDirectory = "$(var.ProjectDir)\Binary" ?>
</Include>
I also have a Patch.wxs file with the following contents. This file is outside the project directory.
Patch.wxs has the following code.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="MyCompany"
MoreInfoURL="https://www.mycompany.com/"
DisplayName="Test Patch"
Description="Test Update Patch"
Classification="Update"
>
<Media Id="5000" Cabinet="RTM.cab">
<PatchBaseline Id="RTM"/>
</Media>
<PatchFamilyRef Id="TestPatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='TestPatchFamily' Version='1.0.0'
Supersede='yes'>
<ComponentRef Id="ProductComponent"/>
</PatchFamily>
</Fragment>
</Wix>
Since Visual Studio doesn't seem to provide a good support for Patch creation, I am using command prompt to generate the transform and the MSP file. I used the project in Visual Studio mainly because, it is really helpful in most of the other scenarios except Patch creation.
In a command prompt (I have already added WixToolSet location in environment variables), I navigated to the Project directory and executed the following commands.
candle.exe -ext WiXUtilExtension -dProjectDir="D:\Projects\WiX\SampleMSI" -dVersion=1.0.0 *.wxs -out 1.0.0\ light.exe -ext WixUIExtension -ext WiXUtilExtension -sval 1.0.0*.wixobj -cultures:en-us -loc Localization\en-us.wxl -xo -out 1.0.0\OldSampleMSI.wixout
candle.exe -ext WiXUtilExtension -dProjectDir="D:\Projects\WiX\SampleMSI" -dVersion=1.0.1 *.wxs -out 1.0.1\ light.exe -ext WixUIExtension -ext WiXUtilExtension -sval 1.0.1*.wixobj -cultures:en-us -loc Localization\en-us.wxl -xo -out 1.0.1\NewSampleMSI.wixout torch.exe -p -xi 1.0.0\OldSampleMSI.wixout 1.0.1\NewSampleMSI.wixout -out Patch\Diff.Wixmst
candle.exe D:\MyProjects\WIX\Patch.wxs -out Patch\ light.exe Patch\Patch.wixobj -out Patch\Patch.WixMsp pyro.exe Patch\Patch.WixMsp -out Patch\Patch.msp -t RTM Patch\Diff.wixmst
The Pyro command is giving a warning and error. I am not sure what is missing or incorrect. Can anyone please help?
Warning (in Patch.wxs): PYRO1079 : The cabinet RTM.cab does not contain any files. If this patch contains no files, then this warning can likely be safely ignored. Otherwise, try passing -p to the torch.exe when first building the transforms, or add a ComponentRef to your PatchFamily authoring to pull changed files into the cabinet.
Error (in wixmst): PYRO0227: The transform being built did not contain any differences so it could not be created.
Can anyone please help me?