问题
I tried to construct a working example of a WiX 3.6 installation script. We currently use WiX 3.5 and now we would like to begin installing the .NET 4 Client Profile framework as a pre-requisite for our MSI file that our product.wxs
script creates. WiX 3.6 seems like the best way forward.
Is there a functional example of how to do this with WiX 3.6?
Here is our 3.5 script we use today:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<!-- Version change handling -->
<?define UpgradeCode="###############################"?>
<?ifdef env.BUILD_NUMBER ?>
<?define ProductVersion="2.6.$(env.BUILD_NUMBER).0"?>
<?else ?>
<?define ProductVersion="2.6.0.0"?>
<?endif ?>
<Product Id="*" Name="###############################" Language="1033" Version="$(var.ProductVersion)" Manufacturer="###############################" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" />
<!-- Custom actions for this installer -->
<Binary Id="###############################.dll" SourceFile="..\..\Libraries\###############################.CA.dll" />
<!-- Kill ##### before installation begins -->
<CustomAction Id="Kill#####ActionId" BinaryKey="###############################.dll" DllEntry="Kill#####Action" Execute="immediate" Impersonate="yes" Return="check" />
<InstallExecuteSequence>
<Custom Action="Kill#####ActionId" Before="InstallInitialize" />
</InstallExecuteSequence>
<!-- ADD/REMOVE Programs icon -->
<Icon Id="##############.ico" SourceFile="D:\##############\Input_WIX\NonHeat\##############.exe" />
<Property Id="ARPPRODUCTICON" Value="##############.ico" />
<Property Id="ARPHELPLINK" Value="http://##############" />
<!-- EULA agreement -->
<WixVariable Id="WixUILicenseRtf" Value="D:\##############\Input_WIX\Heat\License.rtf" />
<!-- Installer images -->
<WixVariable Id="WixUIBannerBmp" Value="InstallerTopImage.rle" />
<WixVariable Id="WixUIDialogBmp" Value="InstallerSideImage.rle" />
<UIRef Id="WixUI_Minimal" />
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="1.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
<!-- Require ##### to be installed -->
<Property Id="#####4.INSTALLPATH">
<RegistrySearch Id="RegistryFoundInstallPath" Key="SOFTWARE\McNeel\#####ceros\4.0" Root="HKLM" Name="InstallPath" Type="directory" />
</Property>
<Property Id="#####4.RECENT">
<RegistrySearch Id="RegistryFoundMostRecent" Key="SOFTWARE\McNeel\#####ceros\4.0" Root="HKLM" Name="MostRecent" Type="raw" />
</Property>
<Property Id="VRAYCOMMONDIR">
<RegistrySearch Id="ReigstryVRayCommon" Key="Software\ASGvis" Root="HKLM" Name="Common_dir" Type="raw" />
</Property>
<Condition Message="##### 4 required before install">
#####4.RECENT
</Condition>
<!-- Require administrator priveleges -->
<Condition Message="You need to be an administrator to install this product.">
Privileged</Condition>
<!-- Require .NET 3.5 SP1 to install -->
<PropertyRef Id="NETFRAMEWORK35_SP_LEVEL" />
<Condition Message='This setup requires the .NET Framework 3.5 with Service Pack 1 be installed.'>
<![CDATA[Installed OR (NETFRAMEWORK35_SP_LEVEL AND NETFRAMEWORK35_SP_LEVEL = "#1")]]>
</Condition>
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="#####4.INSTALLPATH">
<Directory Id="#####4.SYSTEM" Name="System"></Directory>
</Directory>
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="##############"></Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="ProgramMenuFolder">
<Directory Id="ProgramMenuDir" Name="##############" />
</Directory>
</Directory>
<!-- Set FULL permissions to our shared folders -->
<Directory Id="CommonAppDataFolder">
<Directory Id="CommonApp##############" Name="##############">
<Directory Id="MODELLIBPATH" Name="##############">
<Component Id="##############UserPermissions" Guid="##############">
<CreateFolder>
<util:PermissionEx GenericRead="yes" GenericWrite="yes" GenericExecute="yes" Delete="yes" DeleteChild="yes" User="Users" Domain="[MachineName]" />
</CreateFolder>
</Component>
</Directory>
<Directory Id="APPDATAPATH" Name="#####">
<Component Id="##############UserPermissions" Guid="FC4BF85F-E7A4-45DE-B25C-8F9419E75307">
<CreateFolder>
<util:PermissionEx GenericRead="yes" GenericWrite="yes" GenericExecute="yes" Delete="yes" DeleteChild="yes" User="Users" Domain="[MachineName]" />
</CreateFolder>
</Component>
</Directory>
</Directory>
</Directory>
<Directory Id="FontsFolder"></Directory>
<Component Id="##############RegistryKeys" Guid="17A55BEA-605D-425a-AAEE-F35EC8C1061E" DiskId="1" KeyPath="yes">
<RegistryValue Id="##############RegInstallDir" Root="HKLM" Key="Software\##############\##############" Name="InstallPath" Action="write" Type="string" Value="[INSTALLLOCATION]" />
<RegistryValue Id="##############RegLibraryPath" Root="HKLM" Key="Software\##############\##############" Name="LibraryPath" Action="write" Type="string" Value="[INSTALLLOCATION]Library" />
<RegistryValue Id="##############RegModelLibraryPath" Root="HKLM" Key="Software\##############\##############" Name="ModelLibraryPath" Action="write" Type="string" Value="[MODELLIBPATH]" />
<RegistryKey Id="##############Reg#####PluginKey" Root="HKLM" Key="Software\McNeel\#####ceros\4.0\[#####4.RECENT]\Plug-ins\FCAF502A-1572-42a9-A2C3-F25D7953B1A5\PlugIn" Action="create" />
<RegistryValue Id="##############RegName#####4" Root="HKLM" Key="Software\McNeel\#####ceros\4.0\[#####4.RECENT]\Plug-ins\FCAF502A-1572-42a9-A2C3-F25D7953B1A5" Name="Name" Action="write" Type="string" Value="##############Server" />
<RegistryValue Id="##############Reg#####4" Root="HKLM" Key="Software\McNeel\#####ceros\4.0\[#####4.RECENT]\Plug-ins\FCAF502A-1572-42a9-A2C3-F25D7953B1A5" Name="FileName" Action="write" Type="string" Value="[INSTALLLOCATION]##############\##############Server.rhp" />
<RemoveRegistryKey Id="##############Skin" Root="HKLM" Key="Software\McNeel\#####ceros\4.0\Scheme: ##############" Action="removeOnInstall" />
</Component>
<Component Id="VRayKeys" Guid="{96E9EBAC-48B4-4517-9409-F921BE92B3AA}" DiskId="1" KeyPath="yes" NeverOverwrite="yes">
<RegistryValue Id="VRayKey" Root="HKLM" Key="Software\##############\Data" Name="Data" Action="write" Type="string" Value="FFFAAA" />
</Component>
<Component Id="VRayRegistryKeys" Guid="{4D8815FA-85E2-421f-8BF9-F7F5A4133E96}" DiskId="1" KeyPath="yes" NeverOverwrite="yes" Permanent="yes">
<Condition>
NOT VRAYCOMMONDIR
</Condition>
<RegistryValue Root="HKLM" Key="Software\ASGvis" Name="common_dir" Action="write" Type="string" Value="[INSTALLLOCATION]VRay\ASGVIS" />
</Component>
</Directory>
<Feature Id="##############Features" Title="#####" Level="1">
<ComponentGroupRef Id="##############" />
<ComponentRef Id="##############LibraryUserPermissions" />
<ComponentRef Id="##############SharedUserPermissions" />
<ComponentRef Id="##############RegistryKeys" />
<ComponentRef Id="VRayRegistryKeys" />
<ComponentRef Id="VRayKeys" />
<ComponentRef Id="ProgramMenuShortcuts" />
<ComponentRef Id="#####App" />
<ComponentRef Id="WixShortCut" />
<ComponentRef Id="##############ShortCut" />
<ComponentRef Id="TroubleShortCut" />
<ComponentRef Id="DesktopShortcut" />
<ComponentRef Id="VRayAuth" />
<ComponentRef Id="Fonts" />
</Feature>
<InstallExecuteSequence>
<RemoveExistingProducts Before="InstallInitialize" />
</InstallExecuteSequence>
<UI />
</Product>
<Fragment>
<Icon Id="ShortCutIcon" SourceFile="D:\##############Stage\Input_WIX\NonHeat\##############.exe" />
<Icon Id="TroubleShooterIcon" SourceFile="D:\##############Stage\Input_WIX\Heat\TroubleShooter\TroubleShooter.exe" />
<Icon Id="TeamViewerIcon" SourceFile="D:\##############Stage\Input_WIX\Heat\support.exe" />
<DirectoryRef Id="ProgramFilesFolder">
<Component Id="ProgramMenuShortcuts" Guid="881BD571-4FAF-4aa4-AB6E-15BB1629BE06">
<CreateFolder Directory="ProgramMenuDir" />
<RemoveFolder Id="RemoveMenuShortcuts" Directory="ProgramMenuDir" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\##############\##############ShortCut" Name="InstalledStartMenuShortcuts" Type="integer" Value="1" />
</Component>
</DirectoryRef>
<!-- This file is not Heat'ed, so we need this to install the executable -->
<DirectoryRef Id="INSTALLLOCATION" FileSource="Files">
<Component Id="##############App" Guid="FA41A015-7D80-4e50-A909-94BBA4D7546A">
<File Id="#####_Executable" Vital="yes" Source="D:\##############Stage\Input_WIX\NonHeat\##############.exe" />
</Component>
</DirectoryRef>
<DirectoryRef Id="INSTALLLOCATION" FileSource="Files">
<Component Id="WixShortCut" Guid="{8F2596B8-B7EC-4f40-AD64-DFC182A9353A}">
<RegistryKey Root="HKCU" Key="Software\##############\##############ShortCut" Action="create">
<RegistryValue Name="ShortCut" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<Shortcut Id="ProgramMenuApplicationShortcut" Name="##############" Target="[###############_Executable]" Directory="ProgramMenuDir" Show="normal" Icon="ShortCutIcon" />
</Component>
</DirectoryRef>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="TroubleShortCut" Guid="{9E960528-8798-41DD-8DEE-9C3336CD3C88}">
<RegistryKey Root="HKCU" Key="Software\#####\#####ShortCut" Action="create">
<RegistryValue Name="ShortCut2" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<Shortcut Id="TroubleshooterStartmenuShortcut" Name="Troubleshooter" Target="[INSTALLLOCATION]TroubleShooter\TroubleShooter.exe" Directory="ProgramMenuDir" Icon="TroubleShooterIcon" Show="normal"></Shortcut>
</Component>
</DirectoryRef>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="TeamViewerShortCut" Guid="{AD99CAC6-E485-444B-B075-2FD8BE4C87A8}">
<RegistryKey Root="HKCU" Key="Software\#####\#####ShortCut" Action="create">
<RegistryValue Name="ShortCut3" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<Shortcut Id="TeamviewerStartmenuShortcut" Name="Remote Assistance" Target="[INSTALLLOCATION]support.exe" Directory="ProgramMenuDir" Icon="TeamViewerIcon" />
</Component>
</DirectoryRef>
<DirectoryRef Id="INSTALLLOCATION" FileSource="Files">
<Component Id="DesktopShortcut" Guid="{EA9632D1-08ED-4257-A78F-B2373A65A5CF}">
<RegistryKey Root="HKCU" Key="Software\#####\##############ShortCut" Action="createAndRemoveOnUninstall">
<RegistryValue Name="desktopShortcut" Value="1" Type="integer" KeyPath="yes" />
</RegistryKey>
<Shortcut Id="DesktopShortcut" Directory="DesktopFolder" Name="#####" Icon="ShortCutIcon" Target="[######_Executable]" />
</Component>
</DirectoryRef>
<DirectoryRef Id="FontsFolder">
<Component Id="Fonts" Guid="{8C8EE16C-92B6-4926-A41C-55B79429071C}" NeverOverwrite="yes">
<File Id="bradley" Source="Fonts\bradhitc.ttf" TrueType="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="#####4.SYSTEM">
<Component Id="VRayAuth" Guid="{ABED80D1-6EBA-48db-83E0-7CF48B0A55E8}">
<File Id="VRayAuthFile" KeyPath="yes" Source="..\..\Libraries\VRayAuth.dll" />
</Component>
</DirectoryRef>
</Fragment>
</Wix>
回答1:
Heath Stewart's Introducing Managed Bootstrapper Applications provides a basic example in his blog.
回答2:
You need to create a separate WiX bootstrapper project. See Building Installation Package Bundles in the WiX 3.6 documentation.
回答3:
Once you have your bootstrapper, all you need to do is:
Add a reference to the file
WixNetFxExtension.dll
into your bootstrapper / managed bootstrapper application project.Add the following as the first item in your chain.
<PackageGroupRef Id="NetFx40Web"/>
That's it. Further information and options are in the WixNetfxExtension documentation.
来源:https://stackoverflow.com/questions/9021189/a-complete-wix-3-6-bundle-example-bootstrapping-a-net-4-client-profile