次のディレクトリ設定は私にとって完璧に機能します。
_<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フォルダーには何を使用する必要がありますか?
アプリケーションを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"
。
ユーザーごとまたはマシンごとにインストールしていますか?また、どのOSバージョンをターゲットにしていますか?あなたは読みたいかもしれません:
私は最近この問題を抱えていました。インストーラーをマシンごとからユーザーごとに変換したかったのですが、ICE38を入手していました。私はwix-usersに尋ねましたが、ICE38はマシンごとのインストールのチェックとして意図されていたため、無視してもよいという意見がありました。
wix-usersでの議論 を参照してください。
それが事実なので、ICE38は(私の意見では)正しくなく、無視したいと思うでしょう。 ICE38は、マシンごとのインストールのコンテキストでユーザーごとのリソースをインストールしていることを意味しますが、これが正しいことを確認することはありません。
実際にユーザーごとのインストールを作成するには、ICE38を無視する必要があります。これは、その世界では正確ではないためです。
[編集]助けを得たようです ここ 。
ピーター・シルトクリフから:
これは、ユーザーごとのインストールについての私自身の、確かに専門家ではない理解です。
LocalAppDataFolderのサブディレクトリへのインストールは、ユーザーごとのMSIでは完全にOKです。ローミングユーザーに関連する特定のシナリオのため、LocalAppDataFolderの下に作成するディレクトリの要素を含むコンポーネントを追加する必要があります。そのため、ICE64が登場しています。
ICE38エラーは少し誤解を招く可能性があります。ユーザーごとにインストールするため、ユーザーがすべてのユーザーに共通の代替インストール場所を選択できない限り、無視しても問題ありません。 ICE38は、複数のユーザーがすべて同じコンポーネントを同じパスにインストールする状況をチェックしています。
他の人(私のような)を助けるために投稿するだけです。
わかりました。「ProgramFilesFolder」を上書きすることで実行できることがわかりました。
<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty>
もう1つのことは、<Package>
InstallPrivileges
をlimited
に設定する必要があります。
「ProgramFilesFolder」を直接使用できるのに「LocalAppDataFolder」を使用できない理由はわかりません。