web-dev-qa-db-ja.com

LocalAppDataフォルダーにインストールするにはどうすればよいですか?

次のディレクトリ設定は私にとって完璧に機能します。

_<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には使用できないようですが、 ここ で定義されているシステムフォルダのプロパティの1つだと思います。

LocalAppDataフォルダーには何を使用する必要がありますか?

19
Deqing

アプリケーションを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"

11
tronda

ユーザーごとまたはマシンごとにインストールしていますか?また、どのOSバージョンをターゲットにしていますか?あなたは読みたいかもしれません:

Windows 7のユーザーごとまたはマシンごとのインストールコンテキスト用に単一のパッケージを作成する

2

私は最近この問題を抱えていました。インストーラーをマシンごとからユーザーごとに変換したかったのですが、ICE38を入手していました。私はwix-usersに尋ねましたが、ICE38はマシンごとのインストールのチェックとして意図されていたため、無視してもよいという意見がありました。

wix-usersでの議論 を参照してください。

それが事実なので、ICE38は(私の意見では)正しくなく、無視したいと思うでしょう。 ICE38は、マシンごとのインストールのコンテキストでユーザーごとのリソースをインストールしていることを意味しますが、これが正しいことを確認することはありません。

実際にユーザーごとのインストールを作成するには、ICE38を無視する必要があります。これは、その世界では正確ではないためです。

[編集]助けを得たようです ここ

ピーター・シルトクリフから:

これは、ユーザーごとのインストールについての私自身の、確かに専門家ではない理解です。

LocalAppDataFolderのサブディレクトリへのインストールは、ユーザーごとのMSIでは完全にOKです。ローミングユーザーに関連する特定のシナリオのため、LocalAppDataFolderの下に作成するディレクトリの要素を含むコンポーネントを追加する必要があります。そのため、ICE64が登場しています。

ICE38エラーは少し誤解を招く可能性があります。ユーザーごとにインストールするため、ユーザーがすべてのユーザーに共通の代替インストール場所を選択できない限り、無視しても問題ありません。 ICE38は、複数のユーザーがすべて同じコンポーネントを同じパスにインストールする状況をチェックしています。

他の人(私のような)を助けるために投稿するだけです。

2
Wes

わかりました。「ProgramFilesFolder」を上書きすることで実行できることがわかりました。

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

もう1つのことは、<Package>InstallPrivilegeslimitedに設定する必要があります。

「ProgramFilesFolder」を直接使用できるのに「LocalAppDataFolder」を使用できない理由はわかりません。

2
Deqing