2

アップグレード中に構成ファイルを上書きしないようにすることで、forki23のような同様の問題があります。アップグレード中に上書きしてはならない構成ファイルがありますが、アンインストール中に削除する必要があります。しかし、私が見つけたすべての解決策は、何か他のものを壊します。

NoOverwrite=yesを設定し、RemoveExistingProducts を InstallFinalize に移動すると、構成ファイルは希望どおりに処理されます。ただし、この場合、何らかの理由でアップグレード中にショートカットが削除されます。InstallInitialize で RemoveExistingProducts をそのままにしておくと、構成ファイルは実際にはアップグレード中に削除されますが、ショートカットは存在します。

なぜこれが起こっているのですか?それを修正する方法はありますか?

<InstallExecuteSequence>
   <RemoveExistingProducts After="InstallInitialize" />
   <!-- InstallInitialize causes config-file to disappear during upgrade -->
   <!-- InstallFinalize causes shortcuts to disappear during upgrade -->

...

<Property Id="DISABLEADVTSHORTCUTS" Value="1" />

...

<Directory Id="INSTALLLOCATION" Name="MyApp">
  <Component Id="MYAPP.EXE" DiskId="1" Guid="...">
    <File Id="MYAPP.EXE" Name="MyApp.exe" Source="..." Vital="yes" KeyPath="yes">
      <Shortcut Id="startmenuShortcut" 
                Directory="ProgramMenuDir" 
                Name="!(loc.ProductName)" 
                WorkingDirectory='INSTALLLOCATION' 
                Icon="Icon.ico" 
                IconIndex="0" 
                Advertise="yes"  />
    </File>
    <RegistryValue Root="HKLM" 
                    Name="InstallLocation" 
                    Key="$(var.InstallLocationRegistryKey)" 
                    Type="string" 
                    Value="[INSTALLLOCATION]">
    </RegistryValue>
  </Component>
  <Component Id="MYAPP.EXE.CONFIG" DiskId="1" Guid="..." NeverOverwrite="yes">
    <File Id="MYAPP.EXE.CONFIG" 
          Name="MyApp.exe.config" 
          Source="..." 
          KeyPath="yes" />
  </Component>
...
</Directory>

...

<Directory Id="ProgramMenuFolder">
    <Directory Id="ProgramMenuDir" Name="!(loc.ProductPrefix)">
        <Component Id="ProgramMenuDir" Guid="...">
            <RegistryValue Root="HKCU" Key="SOFTWARE\MyApp" 
                           Type="string" Value="[INSTALLLOCATION]" KeyPath="yes" />         
            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
        </Component>
    </Directory>
</Directory>

注 A: config-file はマシン全体の構成であり、すべてのユーザーに適用する必要があります。

注 B: WiX 3.7 を使用しており、ターゲット プラットフォームは Windows 7 および 8 です。

4

3 に答える 3

0

Windows インストーラーはこれらの点で非常に正確に動作し、After="InstallFinalize" の場合に何かが削除された場合、これは、コンポーネントが削除されたことを意味します。MSI は、新しいバージョンの msi に含まれていないため、不要であると考えました。ファイル。MYAPP.exe とショートカットを含むコンポーネントの GUID が新しいバージョンで変更されていないことを確認してください。(Orce や Insted などのツールと比較してください)。あるようです!

MSI は、ショートカットだけでなく、完全なコンポーネントのみを削除します。本当!Windows のショートカットの更新に問題がある可能性があります。時々そのようなことが起こります。これが起こることを確認するために再起動してみてください。テスト手順にエラーがある可能性があります (または、上記の GUID の問題です)。ショートカットを削除するカスタムアクションがない場合、またはショートカットをファイルまたはそのような危険なものとして追加しようとする場合、他に多くの可能性はありません.

.exe と同じコンポーネントにショートカットを配置することは一般的ですが、私の目には最適ではありません。できるだけリソースを分けることをお勧めしますので、独自のコンポーネントに入れます。後でショートカットの名前を変更したい場合、これには利点があります。次に、このコンポーネントの GUID を変更するだけで、重要な .exe ファイルは変更されません。

これには小さな欠点があり、オーバーインストールのシナリオでは MYAPP.exe のファイル バージョンへの直接接続が失われるため、MYAPP.exe が複数の異なるセットアップ間で共有されるファイルである場合、これはお勧めできません。これに対する完全な解決策は可能ですが、ここでは焦点を当てていません。

于 2013-08-09T15:38:36.783 に答える