23

以下目录设置非常适合我。

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id="ProgramFilesFolder">
    <Directory Id='INSTALLDIR' Name='MyApp'/>
  </Directory>
</Directory>

但是,当我尝试将“ProgramFilesFolder”更改为“ LocalAppDataFolderlight ”时,在使用链接和生成我的 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 来说是不可接受的,而我相信它是此处定义的系统文件夹属性之一。

我应该为 LocalAppData 文件夹使用什么?

4

4 回答 4

13

我将应用程序从 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".

于 2013-09-06T19:55:54.087 回答
3

我最近遇到了这个问题。我想将我的安装程序从每台机器转换为每用户但得到 ICE38。我询问了 wix-users,一个意见是您可以忽略 ICE38,因为这意味着检查每台机器的安装。

请参阅wix-users 的讨论

既然如此,ICE38(在我看来)是不正确的,你会想忽略它。ICE38 意味着您在每台机器安装的上下文中安装每用户资源,但从不验证是否如此。

实际上,为每个用户编写安装需要您忽略 ICE38,因为它对于那个世界永远不会准确。

[编辑] 看起来你在这里得到了帮助。

来自彼得·衬衫克里夫:

这是我自己对每个用户安装的理解,诚然是不熟练的:

在每用户 MSI 中安装到 LocalAppDataFolder 的子目录是完全可以的。由于某些与漫游用户相关的场景,您需要为您在 LocalAppDataFolder 下创建的任何目录添加包含元素的组件。这就是ICE64出现的原因。

ICE38 错误有点误导:由于您有按用户安装,只要用户不能选择所有用户通用的替代安装位置,就可以安全地忽略它。ICE38 正在检查多个用户都将相同组件安装到相同路径的情况。

只是发帖帮助其他人(比如我)。

于 2014-02-18T15:12:26.533 回答
2

好的,刚刚发现我们可以通过覆盖“ProgramFilesFolder”来做到这一点:

<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty>

另一件事是,<Package>我们需要设置InstallPrivilegeslimited.

好吧,我看不出为什么可以直接使用“ProgramFilesFolder”而“LocalAppDataFolder”不能。

于 2012-08-24T07:19:20.367 回答
2

您是按用户还是按机器安装?另外,您的目标是什么操作系统版本?您可能想阅读:

在 Windows 7 中为每用户或每机器安装上下文创作单个包

于 2012-08-24T12:40:27.447 回答