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 では受け入れられないようですが、hereで定義されているシステム フォルダー プロパティの 1 つだと思います。

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に尋ねましたが、1つの意見は、ICE38はマシンごとのインストールのチェックを目的としているため、無視してもよいというものでした.

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

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

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

[編集]ここで助けが得られたようです。

ピーター・シャツクリフ より:

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

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

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

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

于 2014-02-18T15:12:26.533 に答える
2

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

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

もう1つ行うことは、に設定する<Package>必要があるということです。InstallPrivilegeslimited

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

于 2012-08-24T07:19:20.367 に答える
2

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

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

于 2012-08-24T12:40:27.447 に答える