如何安装到LocalAppData文件夹?

Deq*_*ing 17 installer windows-installer wix

以下目录设置对我来说非常适合.

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id="ProgramFilesFolder">
    <Directory Id='INSTALLDIR' Name='MyApp'/>
  </Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将"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来说是不可接受的,而我相信它是这里定义的系统文件夹属性之一.

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

tro*_*nda 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"
      />
      ...
Run Code Online (Sandbox Code Playgroud)

当我将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>
   ...
Run Code Online (Sandbox Code Playgroud)

最重要的部分是您必须添加指向的注册表项HKEY_CURRENT_USER.我为每个组件添加了一个注册表值,表明该组件已安装.

我还必须删除以下内容:Advertise="yes".


Deq*_*ing 4

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

<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty>
Run Code Online (Sandbox Code Playgroud)

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

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