我有一个小应用程序,我为其进行了 wix 3 设置,将其安装到本地 AppData 文件夹。这从来不需要管理员权限,并且工作完美。
最近我升级到了 Wix 4,它会自动将 wxs 文件转换为 Wix 4 格式。但现在它开始要求提升权限来安装安装程序。我向其中添加了 Scope="perUser" 以避免它要求提升权限,但现在安装失败并出现错误
错误 0x80070005:无法保护缓存路径:C:\ProgramData\Package Cache
错误 0x80070005:无法保护缓存目录:C:\ProgramData\Package Cache
错误 0x80070005:无法保护每台计算机缓存根。
无法准备包:NetFx462Redist,错误:0x80070005
错误 0x80070005:缓存准备包失败:NetFx462Redist
错误 0x80070005:缓存时失败,中止执行。
为什么会发生这种情况以及如何避免这种情况?
这是我的产品.wxs
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?include common.wxi ?>
<Package Name="$(var.PRODUCT) $(var.VERSION)" UpgradeCode="$(var.UPGRADECODE)" Language="1033" Codepage="1252" Version="$(var.VERSION)" Manufacturer="$(var.MANUFACTURER)" InstallerVersion="200" Scope="perUser">
<SummaryInformation Keywords="Installer, MSI, Package" Manufacturer="$(var.MANUFACTURER)" />
<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="$(var.DOWNGRADEERRORMESSAGE)" />
<MediaTemplate EmbedCab="yes" />
<Property Id="ApplicationFolderName" Value="$(var.MANUFACTURER)\$(var.PRODUCT)" />
<Feature Id="DefaultFeature" Level="1">
<ComponentRef Id="INSTALLDIRComponent" />
</Feature>
<StandardDirectory Id="LocalAppDataFolder">
<Directory Id="INSTALLDIR" Name="MyApp">
<Component Id="INSTALLDIRComponent" Guid="$(var.INSTALLDIRGUID)" Bitness="always64">
<File Id="___var_MyApp.exe" Source="$(var.MyApp.TargetDir)MyApp.exe" />
<File Id="mainExecutableFile" Source="$(var.MyApp.TargetDir)MyApp.Launcher.exe" />
<RegistryValue Root="HKCU" Key="Software\MyApp\MyApp" Name="Exe" Value="[INSTALLDIR]MyApp.exe" Type="string" />
<RegistryValue Root="HKCU" Key="Software\MyApp\MyApp" Name="Path" Type="string" Value="[INSTALLDIR]" KeyPath="yes" />
<RemoveFolder Id="INSTALLDIRfolder" Directory="INSTALLDIR" On="uninstall" />
</Component>
</Directory>
</StandardDirectory>
</Package>
</Wix>
还有 Bundle.wxs
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
<Bundle Name="MyApp" Version="$(var.Version)" Manufacturer="MyApp" UpgradeCode="97baf4b4-4e07-43bb-9042-df6bf3e29f6e">
<bal:Condition Message="You’re using an unsupported version of Windows. MyApp requires Windows 7 SP1 or later." Condition="((VersionNT >= v5.1) AND (ServicePackLevel >= 3)) OR ((VersionNT >= v5.2) AND (ServicePackLevel >= 2)) OR ((VersionNT >= v6.1) AND (ServicePackLevel >= 1)) OR (VersionNT >= v6.2)" />
<Variable Name="LaunchTarget" Value="[LocalAppDataFolder]\MyApp\MyApp.Launcher.exe" Type="formatted" />
<BootstrapperApplication>
<bal:WixStandardBootstrapperApplication LogoFile="Resources/[email protected]" ThemeFile="Resources/ClassicTheme.xml" LocalizationFile="Resources/ClassicTheme.wxl" LicenseUrl="" Theme="hyperlinkSidebarLicense" />
</BootstrapperApplication>
<Chain DisableSystemRestore="yes">
<PackageGroupRef Id="NetFx462Redist" />
<RollbackBoundary />
<MsiPackage Id="SetupAdmin" Compressed="yes" SourceFile="$(var.MSIInstaller.TargetDir)MyApp.msi" Vital="yes">
<MsiProperty Name="INSTALLLOCATION" Value="[INSTALLDIR]" />
<MsiProperty Name="BUNDLEKEY" Value="[WixBundleProviderKey]" />
</MsiPackage>
</Chain>
</Bundle>
</Wix>
NetFx462Redist
可能被标记为始终缓存(v4 中的新功能),因此 Burn 希望缓存它。这是每台计算机的包,因此 Burn 应该需要提升才能缓存每台计算机的包。但是,您的捆绑包现在总体上是针对每个用户的(因为每个用户包),因此 Burn 可能会跳过提升。很难说,因为您只提供了日志文件的一个片段。
如果我的猜测是正确的,这可能是 Burn 中的一个错误。但我可能会错过一些东西。您可能应该调试 Burn 才能确定。