2012-08-24 16 views
12

以下のディレクトリ設定は、私にとって完璧に機能します。LocalAppDataフォルダにはどのようにインストールしますか?

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

しかし、私は変化する "ProgramFilesFolderのを" しようとしたときにエラーの "LocalAppDataFolder"、私が得たたくさんの私のMSIをリンクして生成するlightを使用して:

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.

がどのように見えます」私はそれがhereで定義されたシステムフォルダのプロパティの1つだと思っていますが、LocalAppDataFolderはWiXでは受け入れられません。

LocalAppDataフォルダには何を使用しますか?

+0

私のアドバイス:userprofileフォルダにはまったくインストールしないでください。 [ProgramFilesFolder]にインストールし、オペレーティングシステムがリダイレクトを行うことを許可します。各OSはこれを別々に行うことができ、あなたの「フードフィックスの下で」あなたは間違いなく逆火するでしょう。フォルダがOSによってリダイレクトされない場合、MSI参照カウントは、同じフォルダに対する異なるユーザのいくつかのインストールを処理することができるはずです。フォルダ内で変更する読み取り/書き込みファイルがないことを確認してください。あなたのインストールフォルダは読み取り専用でなければなりません。 Windowsの独特のものと戦わないでください - それは復讐と噛み付きます。 –

+0

ここでの問題は、[ProgramFilesFolder]をユーザー単位のインストールのためにリダイレクトする方法を知らないことです。だから私は回避策を見つけなければならなかった。 – Deqing

+0

はい、リダイレクトしないでください:-)。 WindowsはVista、Windows 7、Windows 8などで別の方法であなたをリダイレクトする可能性があります.Windows Installerは戦うのは危険です。ユーザーごとのインストールでも[ProgramFilesFolder]にインストールできますが、Windowsのバージョンによっては自動的にリダイレクトされるものもあれば、ProgramFilesFolderにインストールされるものもあります。これを混乱させないでください。Windowsが指示するように動作させてください。 –

答えて

1

[OK]を、ちょうど私たちは「ProgramFilesFolderの」を上書きすることによってそれを行うことが分かっ:行うには

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

もう一つは、<Package>に我々はlimitedInstallPrivilegesを設定する必要があります。

「LocalAppDataFolder」ができない間、「ProgramFilesFolder」を直接使用できる理由はありません。

+0

これを行う必要はないからです。 Win7で自動的にリダイレクトされます。 –

+0

ProgramFilesFolderは私のWin7ではリダイレクトしていません。私はInstallPrivilegesを 'limited'とデフォルト値の両方で試してみましたが、%ProgramFilesFolder%を 'C:\ Program Files(x86)'に設定しました。このリダイレクトをどのようにトリガーしますか?また、WixUI_Advancedでは、ユーザーごとのインストールパスを%LocalAppData%\ Apps \ ProgramNameに明示的に設定しています。だから、プログラムの正式なバージョンは、ユーザーごとにインストールする必要がありますか? '%LocalAppData%\ Apps'、または'%LocalAppData%\ Programs'? – Deqing

+1

Deqing、このソリューションは危険に見えます - 私はWindowsインストーラが実際にあなたにそれをさせることに驚いています。 –

2

ユーザーごとまたはマシンごとにインストールしていますか?また、どのOSバージョンでターゲット設定していますか?あなたは、参照することもできます。

Authoring a single package for Per-User or Per-Machine Installation context in Windows 7

+0

私はユーザーごとにインストールしています。そのため、ディレクトリ構造にLocalAppDataが必要です。そしてそれはWin7にインストールされます。私にとっては唯一の方法は前に説明したように 'SetProperty'を使うことです。 – Deqing

+0

その記事によると、ProgramFilesFolderを使用してWin7でのPer-Userのインストールは自動的にLocalAppData \ Programsにリダイレクトされます。これはあなたのために働かないのですか? –

+0

InstallShieldを使用してテスト用のテストを作成し、[ProgramFilesFolder] My Company Name \ My Product Nameを使用してセットアップしました.C:\ Users \ chrpai \ AppData \ Local \ Programs \ My Company Name \ My製品名 –

7

私はperMachineは、閲覧者をインストールするインストールされてからアプリケーションを変換します。適切にインストールを変換するために、私はそれぞれのコンポーネントのレジストリキーを追加しなければなりませんでした。私は、インストールユーザーにexeファイルのコンポーネントを移動したとき、私はこのような何かをしなければならなかった

<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" 
     /> 
     ... 

はもともと、私は次のように持っていた

<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"

+0

私はICE38を無視することができると言われました。これは、ユーザー/マシンの混在した場所でのみ有効で、純粋なユーザーごとのインストールでは無効です。 [ここ](http://stackoverflow.com/a/21715783/623561)を参照してください。 – Wes

1

最近この問題が発生しました。私はインストーラをマシンごとにユーザごとに変換したいのですが、ICE38を入手していました。私はWixユーザーに尋ねましたが、ICE38を無視することができるという意見がありました。これは、マシン単位のインストールのチェックとして意味されていたからです。

the discussion at wix-usersを参照してください。

この場合、ICE38は(私の意見では)間違っているので、無視してください。 ICE38は、マシン単位のインストールのコンテキストでユーザーごとのリソースをインストールしていることを意味しますが、これはそうであることを決して確認しません。

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

[編集] 助けを得たようです。hereピーター・シャートクリフから

これは、ユーザーごとのインストールの私自身、確かに下手、理解です:LocalAppDataFolderのサブディレクトリにインストール

は 、ユーザーごとのMSIに完全にOKです。ローミングユーザーに関する特定のシナリオのため、 は、LocalAppDataFolderの下に作成する ディレクトリの要素を含むコンポーネントを追加する必要があります。だからこそICE64は です。

ICE38のエラーは少し紛らわしいです:あなたは、ユーザーごとの インストールを持っているので、それは限り、ユーザーはすべてのユーザーに共通する 代替のインストール場所を選ぶことができないとして無視しても安全です。 ICE38は です。複数のユーザーがすべて同じパスに同じ コンポーネントをインストールする状況を確認します。

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

関連する問題