WiX: Как переопределить "C:\Program Files (x86)" на компьютере x64 в последовательности WixUI_Advanced?
Я использую последовательность WixUI_Advanced, чтобы пользователи могли выбрать установку для каждого компьютера или для каждого пользователя и изменить папку назначения. Мой проект WiX предназначен для создания как x86, так и x64 MSI (я использую рекомендации WiX Tips and Tricks). Я также сохраняю папку установки приложения в реестре для крупных обновлений (я использую свойство APPLICATIONFOLDER и идентификатор каталога - вместо INSTALLLOCATION - в соответствии с требованиями WixUI_Advanced).
В последовательности WixUI_Advanced есть ошибка, из-за которой в диалоговом окне "Папка назначения" папка приложения отображается в папке C:\Program Files (x86) вместо C: \ Program Files при работе на 64-разрядной машине, даже когда код правильно устанавливает приложение папку для свойства ProgramFiles64Folder. Комментарий к трекеру ошибок предлагает использовать элемент SetDirectory для установки значения APPLICATIONFOLDER, но нет примера, объясняющего, как это сделать. Когда я пытался, это не имело никакого значения (я также нашел несколько постов, рекомендующих использовать настраиваемое действие для установки APPLICATIONFOLDER, но ни один из них не работал для меня). Кто-нибудь знает, как заставить последовательность WixUI_Advanced отображать правильную папку "Program Files" в 64-битной системе (а также отображать первоначально выбранную папку во время основных обновлений)?
Если это поможет, я предоставлю примеры фрагментов WXS, но они в значительной степени следуют рекомендациям из поста " Советы и хитрости WiX" в Stackru. Кроме того, мой 64-разрядный пакет MSI действительно является 64-разрядным (у меня есть пакет и компоненты, помеченные как "x64"; он не работает на 32-разрядных платформах). Я использую WiX 3.6 и Visual Studio 2010,
ОБРАЗЕЦ КОДА:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product
Id="81955f17-31f3-4e51-8294-372f96141c00"
Name="WiX64BitDemo"
Language="1033"
Version="1.0.0.0"
Manufacturer="Test"
UpgradeCode="5bed9777-bea6-4dc3-91d7-5dd93819563a">
<Package
InstallerVersion="300"
Compressed="yes"
InstallScope="perMachine"
Platform="x64" />
<MajorUpgrade
AllowSameVersionUpgrades="no"
DowngradeErrorMessage="Can't downgrade."
Schedule="afterInstallInitialize" />
<Media
Id="1"
Cabinet="media1.cab"
EmbedCab="yes" />
<Property Id="APPLICATIONFOLDER" Secure="yes">
<RegistrySearch Id="FindInstallLocation"
Root="HKLM"
Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]"
Name="InstallLocation"
Type="raw"
Win64="yes" />
</Property>
<Property Id="ApplicationFolderName" Value="WiX64BitDemo" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<SetDirectory
Id="APPLICATIONFOLDER"
Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="APPLICATIONFOLDER" Name="WiX64BitDemo">
<Component
Id="ReadmeComponent"
Guid="*"
Win64="yes">
<File
Id="ReadmeFile"
Name="readme.txt"
Source="$(var.ProjectDir)readme.txt"
KeyPath="yes"/>
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="WiX64BitDemo" Level="1">
<ComponentRef Id="ReadmeComponent" />
</Feature>
<UI Id="UISequence">
<UIRef Id="WixUI_Advanced"/>
</UI>
</Product>
</Wix>
Большое спасибо Саше Бомонту за решение этой проблемы. Вот рабочий образец:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product
Id="81955f17-31f3-4e51-8294-372f96141c00"
Name="WiX64BitDemo"
Language="1033"
Version="1.0.0.0"
Manufacturer="Test"
UpgradeCode="5bed9777-bea6-4dc3-91d7-5dd93819563a">
<Package
InstallerVersion="300"
Compressed="yes"
InstallScope="perMachine"
Platform="x64" />
<MajorUpgrade
AllowSameVersionUpgrades="no"
DowngradeErrorMessage="Can't downgrade."
Schedule="afterInstallInitialize" />
<Media
Id="1"
Cabinet="media1.cab"
EmbedCab="yes" />
<Property Id="APPLICATIONFOLDER" Secure="yes">
<RegistrySearch Id="FindInstallLocation"
Root="HKLM"
Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]"
Name="InstallLocation"
Type="raw"
Win64="yes" />
</Property>
<Property Id="ApplicationFolderName" Value="WiX64BitDemo" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<SetDirectory
Id="APPLICATIONFOLDER"
Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="APPLICATIONFOLDER" Name="WiX64BitDemo">
<Component
Id="ReadmeComponent"
Guid="*"
Win64="yes">
<File
Id="ReadmeFile"
Name="readme.txt"
Source="$(var.ProjectDir)readme.txt"
KeyPath="yes"/>
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="WiX64BitDemo" Level="1">
<ComponentRef Id="ReadmeComponent" />
</Feature>
<UI Id="UISequence">
<UIRef Id="WixUI_Advanced"/>
</UI>
<CustomAction
Id="OverwriteWixSetDefaultPerMachineFolder"
Property="WixPerMachineFolder"
Value="[APPLICATIONFOLDER]"
Execute="immediate"
/>
<CustomAction
Id="SetARPINSTALLLOCATION"
Property="ARPINSTALLLOCATION"
Value="[APPLICATIONFOLDER]"
/>
<InstallUISequence>
<Custom Action="OverwriteWixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="OverwriteWixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Custom Action="SetARPINSTALLLOCATION" After="InstallValidate"/>
</InstallExecuteSequence>
</Product>
</Wix>
3 ответа
Что-то вроде этого, вероятно, сделает свое дело:
<MajorUpgrade AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="Can't downgrade."
Schedule="afterInstallInitialize" />
<Property Id="APPLICATIONFOLDER" Secure="yes">
<RegistrySearch Id="FindInstallLocation"
Root="HKLM"
Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[WIX_UPGRADE_DETECTED]"
Name="InstallLocation"
Type="raw"
Win64="yes" />
</Property>
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" />
<InstallUISequence>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
</InstallExecuteSequence>
<SetProperty Id="ARPINSTALLLOCATION" Value="[APPLICATIONFOLDER]" After="CostFinalize" />
ОБНОВИТЬ: SetDirectory
планирует действие до WixSetDefaultPerMachineFolder
- обновлен код для запланированных вручную элементов для планирования между WixSetDefaultPerMachineFolder
а также WixSetPerMachineFolder
, Протестировано нормально с примером кода OP под Win7 x64
UPDATE2: добавлено действие для установки ARPINSTALLOCATION
как http://robmensching.com/blog/posts/2011/1/14/ARPINSTALLLOCATION-and-how-to-set-it-with-the-WiX-toolset
Мне пришлось изменить две вещи, чтобы WIX поместил мое 64-битное приложение в папку Program Files:
A. В элемент Пакета WIX добавьте 'Platform = "x64"':
‹Описание пакета =" desc... "Manufacturer =" company... "InstallerVersion =" 200 " Platform =" x64 " Сжатый ="yes" /›
Б. В элементе Directory для верхней папки измените ProgramFilesFolder на ProgramFiles64Folder:
‹Directory Id ="ProgramFiles64Folder"Name =" PFiles "›
(Я также должен был включить файл ‹имя программы› .exe.config в папку, чтобы программа работала правильно)
Я думаю, что вам нужно установить Win64
собственность на Yes
для одного из узлов.