以下目录设置对我来说非常适合。
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id="ProgramFilesFolder">
<Directory Id='INSTALLDIR' Name='MyApp'/>
</Directory>
</Directory>
但是,当我尝试将“ProgramFilesFolder”更改为“ LocalAppDataFolder ”时,使用light
链接并生成我的msi时出现了很多错误:
D:\runGroup.wxs(53) : error LGHT0204: ICE38: Component cmpA5561BE36D80EB58252E69DDA0C2FF8C installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.
D:\main.wxs(38) : error LGHT0204 : ICE64: The directory INSTALLDIR is in the user profile but is not listed in the Remove File table.
看起来“LocalAppDataFolder”不适用于WiX,而我认为它是here中定义的系统文件夹属性之一。
我应该为LocalAppData文件夹使用什么?
答案 0 :(得分:11)
我将应用程序从perMachine安装转换为perUser安装。为了正确转换安装,我必须为我拥有的每个组件添加一个注册表项。
最初我有以下内容:
<Component Id="C.MyExe">
<File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" Source="$(var.MyExe.TargetPath)" DiskId="1">
<Shortcut Id="SC.StartMenu"
Directory="D.ApplicationMenuDir"
Name="$(var.AppName)"
WorkingDirectory="INSTALLDIR"
Icon="MY_ICON.ico"
IconIndex="0"
Advertise="yes"
/>
...
当我将exe组件移动到用户安装时,我必须做这样的事情:
<Directory Id="LocalAppDataFolder" Name="AppData">
<Directory Id="MyAppDirectory" Name="$(var.AppName)">
<Component Id="C.MyExe" Guid="{MY_GUID}">
<CreateFolder />
<RemoveFolder Id="RemoveMyAppDirectory" On="uninstall" />
<RegistryKey Root="HKCU" Key="Software\MyCompany\MyApp">
<RegistryValue Name="MainExe" Value="1" KeyPath="yes" Type="integer" />
</RegistryKey>
<File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)"
Source="$(var.MyExe.TargetPath)" DiskId="1" Checksum="yes">
</File>
</Component>
...
最重要的是,您必须添加一个指向HKEY_CURRENT_USER
的注册表项。我为每个组件添加了一个注册表值,表明该组件已安装。
我还必须删除以下内容:Advertise="yes"
。
答案 1 :(得分:2)
好的,我们发现我们可以通过覆盖“ProgramFilesFolder”来实现:
<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty>
另一件事是,<Package>
我们需要将InstallPrivileges
设置为limited
。
好吧,我看不出为什么“ProgramFilesFolder”可以直接使用而“LocalAppDataFolder”不能直接使用。
答案 2 :(得分:2)
您是按用户安装还是按机器安装?此外,您正在针对哪些操作系统版本?您可能需要阅读:
Authoring a single package for Per-User or Per-Machine Installation context in Windows 7
答案 3 :(得分:1)
我最近遇到了这个问题。我想将我的安装程序从每台机器转换为每用户但是获得了ICE38。我询问了wix用户,并且有一种意见认为你可以忽略ICE38,因为这意味着要检查每台机器的安装。
请参阅the discussion at wix-users。
既然如此,ICE38(在我看来)是不正确的,你会想忽略它。 ICE38意味着您在每台计算机的安装环境中安装每用户资源,但从未验证过是这样。
实际上,为每个用户安装创作需要您忽略ICE38 因为这个世界永远不会准确。
[编辑] 看起来你得到了帮助here。
来自Peter Shirtcliffe:
对于每个用户的安装,这是我自己的,无可置疑的理解:
安装到LocalAppDataFolder的子目录是完全可以的 每用户MSI。由于某些与漫游用户相关的场景,您 需要添加包含任何元素的组件 您在LocalAppDataFolder下创建的目录。这就是ICE64的原因 出现。
ICE38错误有点误导:因为你有一个每用户 安装,只要用户不能选择,就可以安全地忽略 所有用户通用的备用安装位置。 ICE38是 检查多个用户都安装相同的情况 组件到同一路径。
只是发帖帮助其他人(比如我)。