WiX: Как переопределить «C: \ Program Files (x86)» на компьютере x64 в последовательности WixUI_Advanced? - PullRequest
14 голосов
/ 30 марта 2011

Я использую последовательность WixUI_Advanced , чтобы пользователи могли выбрать на машину или на пользователя и изменить папку назначения.Мой проект WiX предназначен для создания MSI x86 и x64 (я использую Советы и рекомендации по WiX рекомендации).Я также сохраняю папку установки приложения в реестре для крупных обновлений (я использую свойство APPLICATIONFOLDER и идентификатор каталога - вместо INSTALLLOCATION - в соответствии с требованиями WixUI_Advanced).

В последовательности WixUI_Advanced имеется ошибка , из-за которой в диалоговом окне «Папка назначения» отображается папка приложения в папке C: \ Program Files (x86) вместо C: \ Program Files при работе на 64-разрядной машине, даже если код правильно устанавливает папку приложения в свойство ProgramFiles64Folder .В комментарии к трекеру ошибок предлагается использовать элемент SetDirectory для установки значения APPLICATIONFOLDER, но в нет примера , объясняющего, как это сделать.Когда я пытался, это не имело никакого значения (я также нашел несколько постов, рекомендующих использовать пользовательское действие для установки APPLICATIONFOLDER, но ни один из них не работал для меня).Кто-нибудь знает, как заставить последовательность WixUI_Advanced отображать правильную папку «Program Files» в 64-битной системе (а также отображать первоначально выбранную папку во время основных обновлений)?

Если это поможет, я предоставлю образец WXSфрагменты, но они в значительной степени следуют рекомендациям из поста StackOverflow Советы и хитрости WiX .Кроме того, мой 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 ]

14 голосов
/ 30 марта 2011

Что-то вроде этого, вероятно, сработает:

<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

ОБНОВЛЕНИЕ2: Добавлено действие для установки ARPINSTALLOCATION как http://robmensching.com/blog/posts/2011/1/14/ARPINSTALLLOCATION-and-how-to-set-it-with-the-WiX-toolset

6 голосов
/ 15 мая 2012

Мне пришлось изменить две вещи, чтобы WIX поместил мое 64-битное приложение в папку Program Files:

A.В элемент пакета WIX добавьте 'Platform = "x64"':

‹Описание пакета =" desc ... "Manufacturer =" company ... "InstallerVersion =" 200 " Platform ="x64 " Сжатый =" да "/›

B.В элементе Directory для верхней папки измените ProgramFilesFolder на ProgramFiles64Folder:

‹Directory Id =" ProgramFiles64Folder"Name =" PFiles "›

(мне также пришлосьвключите в папку ‹имя программы› .exe.config для правильной работы программы)

0 голосов
/ 30 марта 2011

Я думаю, вам нужно установить для свойства Win64 значение Yes для одного из узлов.

...