WixUi更改安装目录不起作用



我正在使用Wix Toolset为我的应用程序创建安装程序,我对这项技术非常陌生。

我需要能够在每个用户和每台机器的基础上安装,每个用户安装在%LOCALAPPDATA%文件夹中,每个机器安装在PROGRA~1中。

我试着从Wix Toolset中学习这个例子,但没有成功。

我还试图建立我自己的界面(部分内容取自本文(,这并没有重写安装文件夹:

<UI Id="UserInterface">
<Property Id="WixUI_Mode" Value="Custom" />

<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="9" Bold="yes" />
<TextStyle Id="WixUI_Font_Title"  FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<DialogRef Id="InstallScopeDlg"/>
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="FatalError" />
<DialogRef Id="UserExit" />
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallScopeDlg">1</Publish>
<Publish Dialog="InstallScopeDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="{}" Order="2">WixAppFolder = "WixPerUserFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="1" Order="3">WixAppFolder = "WixPerMachineFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="{}" Order="4">WixAppFolder = "WixPerUserFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="1" Order="5">WixAppFolder = "WixPerMachineFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="INSTALLFOLDER" Value="[WixPerUserFolder]" Order="6">WixAppFolder = "WixPerUserFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Property="INSTALLFOLDER" Value="[WixPerMachineFolder]" Order="7">WixAppFolder = "WixPerMachineFolder"</Publish>
<Publish Dialog="InstallScopeDlg" Control="Next" Event="EndDialog" Value="Return">1</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return">1</Publish>
</UI>

无论我在安装过程中选择哪个范围,安装程序都会尝试将文件写入PROGRA~1文件夹。

我现在的猜测是<Directory Id="ProgramFiles64Folder" />正在强制安装程序使用Program Files文件夹,这需要提升权限。我尝试了<Directory Id="INSTALLATIONLOCATION" />,它将安装移到了ProgramData,还尝试将ConfigurableDirectory属性应用于我的功能,但不起作用。

我的产品.wxs配置:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="{GUID}" Name="My App" Language="1033" Version="1.0.0.0" Manufacturer="Company" UpgradeCode="{GUID}">
<Package InstallerVersion="301" Compressed="yes" InstallPrivileges=""/>
<WixVariable Id="WixUIBannerBmp" Value="ImagesBanner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="ImagesDialog.bmp" />
<WixVariable Id="WixUISupportPerMachine" Value="1" />
<WixVariable Id="WixUISupportPerUser" Value="1" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="yes" />
<MediaTemplate EmbedCab="yes" />
<PropertyRef Id="NETFRAMEWORK45"/>
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<Property Id="ApplicationFolderName" Value="My App" />
<Property Id="WixAppFolder" Value="WixPerUserFolder" />
<Icon Id="icon.ico" SourceFile="Icon.ico"/>
<!-- Check for .NET version -->
<Condition Message="This application requires .NET Framework 4.5.2 or higher. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK45]]>
</Condition>
<Directory Id="TARGETDIR" Name="SourceDir">
<Merge Id="VCRedist" SourceFile="Microsoft_VC141_CRT_x64.msm" DiskId="1" Language="0"/>
<Directory Id="ProgramFiles64Folder"> <!-- Is this the problem, how can I make this configurable depending on user selection?-->
<Directory Id="INSTALLFOLDER" Name="My App" />
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="Company"/>
</Directory>
</Directory>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="{GUID}">
<Shortcut Id="ApplicationStartMenuShortcut" Name="My App" Target="[#App.exe]" WorkingDirectory="INSTALLFOLDER"/>
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="SoftwareCompanyMy App" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</DirectoryRef>
<Feature Id="VCRedist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1" >
<MergeRef Id="VCRedist"/>
</Feature>
<Feature Id="ProductFeature" Title="My App" Level="1">
<ComponentGroupRef Id="MyFiles" />
<ComponentRef Id="ApplicationShortcut" />
</Feature>
<UI Id="UserInterface">
<!-- see above -->
</UI>
<UIRef Id="WixUI_Advanced" />
</Product>

我抓着救命稻草,找不到任何可靠的例子或文档来解决目录问题。如何根据安装范围内的选择将安装文件夹设置为%LOCALAPPDATA%PROGRA~1

使用WixUI_Advanced UI时,有三个属性可以控制默认安装范围:"ALLUSERS"、"Privileged"one_answers"MSIINSTALLPERUSER"。

属性"WixAppFolder"将控制单击"高级"按钮时默认选择哪个单选按钮。

还有一个已知的wix错误需要一个变通方法:https://github.com/wixtoolset/issues/issues/2376

总之,wix配置可以是:

  • 每个用户

    <属性Id='PixAppFolder'值='PixPerUserFolder'/>
    <属性Id='ALLUSERS'值='2'/>
    <属性Id="特权"值="0"/>
    <属性Id='MSIINSTALLPERUSER'值='1'/>
    <用户界面>
    <UIRef Id='WixUI_Advanced'/>
    <UIRef Id='WixUI_ErrorProgressText'/>
    <发布对话框='InstallScopeDelg'控件='Next'属性='MSIINSTALLPERUSER'值='1'顺序='3'>WixAppFolder=";WixPerUserFolder">
    <发布对话框='InstallScopeDelg'控件='Next'属性='MSIINSTALLPERUSER'值='{}'顺序='2'>WixAppFolder=";WixPerMachineFolder">
    <发布对话框='InstallScopeDelg'控件='Next'事件='DoAction'值='PixSetDefaultPerMachineFolder'顺序='3'>WixAppFolder=";WixPerMachineFolder">
    <发布对话框='InstallScopeDelg'控件='Next'事件='DoAction'值='PixSetDefaultPerUserFolder'顺序='3'>WixAppFolder=";WixPerUserFolder">
    <用户界面>

  • 每台机器

    <属性Id='PixAppFolder'值='PixPerMachineFolder'/>
    <属性Id='ALLUSERS'值='1'/>
    <属性Id="特权"值="1"/>
    <属性Id='MSIINSTALLPERUSER'值='0'/>
    <用户界面>
    <UIRef Id='WixUI_Advanced'/>
    <UIRef Id='WixUI_ErrorProgressText'/>
    <发布对话框='InstallScopeDelg'控件='Next'属性='MSIINSTALLPERUSER'值='1'顺序='3'>WixAppFolder=";WixPerUserFolder">
    <发布对话框='InstallScopeDelg'控件='Next'属性='MSIINSTALLPERUSER'值='{}'顺序='2'>WixAppFolder=";WixPerMachineFolder">
    <发布对话框='InstallScopeDelg'控件='Next'事件='DoAction'值='PixSetDefaultPerMachineFolder'顺序='3'>WixAppFolder=";WixPerMachineFolder">
    <发布对话框='InstallScopeDelg'控件='Next'事件='DoAction'值='PixSetDefaultPerUserFolder'顺序='3'>WixAppFolder=";WixPerUserFolder">
    <用户界面>

BTW,我创建了一个项目来简化wix的配置。希望它能帮助:https://github.com/xinnj/WiXCover

最新更新