2

インストーラーと一緒に出荷されていた製品があり.vdprojます。最新バージョンでは、WiXを使用してインストーラーを完全にやり直したベータ版を出荷しました(.vdprojをサポートしなくなったVisual Studio 2012への移行の一環として)。残念ながら、当時、アップグレードコードがコピー間で一貫しているはずであり、別のアップグレードコードを含む1つのベータインストーラーがすでに出荷されていることを知りませんでした。

.vdprojインストーラーでビルドされた以前のバージョンと、ベータ版のコピーとして出荷されたバージョンをインストーラーで自動的に削除したいと思います。これは私がこれまでに得たところです:

<Product Id="{A4CBA9F9-D86B-400C-BD23-996B4367931A}" Name="Foo Viewer" Language="1033" Version="6.0.1.0" Manufacturer="Foo Corporation" UpgradeCode="43e024b8-b3ea-40a3-a854-2af83f207f0f">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

<MediaTemplate EmbedCab="yes" />

<Feature Id="FOOVIEWERFeature" Title="Foo Viewer" Level="1" Description="The Foo Viewer GUI and CLI binaries." AllowAdvertise="no" Absent="disallow" Display="expand">
<!-- Stuff -->
</Feature>

<PropertyRef Id="NETFRAMEWORK40CLIENT" />
<Condition Message="Foo Viewer requires the .NET Framework 4.0 Client Profile or higher to run.">Installed OR NETFRAMEWORK40CLIENT</Condition>

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UIRef Id="FooViewerInstallerUI" />
<UIRef Id="WixUI_ErrorProgressText" />
<Icon Id="FooViewerIcon" SourceFile="../FooViewer.ico" />
<Property Id="ARPPRODUCTICON" Value="FooViewerIcon" />

<!-- I got this upgrade code by opening one of the old .vdproj MSIs in Orca -->
<Upgrade Id="{80539F30-8176-4DCC-A102-ED32A34A91CB}">
  <UpgradeVersion OnlyDetect="no"
                  Minimum="0.0.0.0"
                  IncludeMinimum="yes"
                  MigrateFeatures="no"
                  IgnoreRemoveFailure="no"
                  Property="UPGRADE_VDPROJ_FOOVIEWER"
                  />
</Upgrade>
<Upgrade Id="{43e024b8-b3ea-40a3-a854-2af83f207f0f}">
  <!-- Foo Viewer 6.0.0.0 (Beta) shipped with a version 5.3.0.0 in the installer. -->
  <UpgradeVersion OnlyDetect="no"
                  Minimum="5.3.0.0"
                  Maximum="5.3.0.0"
                  IncludeMinimum="yes"
                  IncludeMaximum="yes"
                  MigrateFeatures="yes"
                  IgnoreRemoveFailure="no"
                  Property="UPGRADE_WIX_FOOVIEWER"
                  />

  <!-- Detect newer versions -->
  <UpgradeVersion OnlyDetect="yes"
                  Minimum="6.0.1.0"
                  IncludeMinimum="no"
                  Property="NEW_VERSION_FOUND"/>
</Upgrade>
<Condition Message="A newer version of Foo Corporation Foo Viewer is already installed.">
  Installed OR NOT NEW_VERSION_FOUND
</Condition>
<InstallExecuteSequence>
  <RemoveExistingProducts Before="InstallInitialize" />
</InstallExecuteSequence>
</Product>

ただし、<upgrade>古いインストーラーのアップグレードコードの要素を追加しても、古いバージョンは削除されません。その結果、新しいコピーは古いコピーの上にインストールしようとし、どちらのバージョンも機能しなくなります。

ベータコピーおよび新しいバージョンの検出は正しく機能<Upgradeします(GUID {43e024b8-b3ea-40a3-a854-2af83f207f0f}を使用)。ベータ版がアンインストールされ、「新しい」インストーラーを生成すると、現在のインストーラーが正しくインストールされません。つまり、WiXインストーラーは問題なくお互いを検出できます。

.vdprojインストールされている古いコピーを検出できない、ここで間違ったことはありますか?

編集:これが発生したときにインストールプロセスのログを作成します。次のようになります。

Action start 17:25:47: FindRelatedProducts.
MSI (c) (10:B8) [17:25:47:269]: FindRelatedProducts: current install is per-machine.  Related install for product '{2024FF03-D6F2-4065-A22B-80252B2A66B6}' is per-user.  Skipping...
Action ended 17:25:47: FindRelatedProducts. Return value 1.

これは正確に見えます。古いインストーラーは「ユーザーごと」または「マシンごと」のオプションを提供していましたが、新しいインストーラーは常にマシンごとに強制します。古いインストーラーで「このコンピューターを使用するすべての人」を選択すると、新しいインストーラーがそれを検出できます。WiXで可能であればどちらかのオプションを検出したいと思います。

4

1 に答える 1

1

残念ながら、単一のインストーラーで同時に 2 つの異なる既存のインストールを処理することはできません。さらに、msi は同時インストールでは機能しないため、別の製品のアンインストールを実行しようとしないでください (UpgradeCode と ProductCode が異なるため、別の製品です)。

がお勧めするのは、別のexeアプリケーション(ブートストラップ)を作成することです。これは、以前にインストールされた製品の子アンインストールプロセスを実行し、すぐに製品のインストールを実行します(おそらくフルUIモードで)。

ユーザーの操作なしで製品をアンインストールするには、次のコマンドを使用します。

msiexec /x {ProductCode} /qn

以前にインストールした製品の ProductId をご存じでしょうか。そうでない場合は、レジストリを検索して見つけることができます。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}\DisplayName

アプリケーションが単一ユーザー用にインストールされている場合は、HKEY_CURRENT_USER。

レジストリ パスに記載されている {ProductCode} は、productCode である GUID です。「Uninstall」ブランチですべてのノードを取得し、「DisplayName」属性をチェックしている製品を見つける必要があります。少なくともインストールされている製品の名前を知っていることを願っています =)。また、クライアントのマシン上のすべてのソフトウェアを削除しないように注意してください =)

x64 マシンに x86 アプリケーションをインストールした場合は、場所を検索する必要があります。

HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{ProductCode}\DisplayName"

もう 1 つ重要な注意事項: ブートストラップも x86 アプリケーションである場合は、要求されたパスに自動的に挿入されるため、「Wow6432Node」ノードなしでノードを取得する必要があります。さまざまなプラットフォームでのレジストリ キーの素晴らしい世界 =)。

ブートストラップが管理者権限で実行されるか、権限の昇格を要求されることを確認してください(セキュリティ マニフェストが含まれている必要があります)。

投稿の問題に関する 1 つの仮定: UpgradeCode を変更したときに ProductCode を変更しなかった可能性がありますか? どのように動作するかはわかりませんが、以前にインストールされた製品を自動的に削除する MajorUpgrade ではないことは間違いありません。詳細については、アップグレードに関する Wix のドキュメントを参照してください。そのため、以前にインストールされたファイルの上に新しいコンポーネントを直接インストールするマイナー アップグレードまたはパッチを入手した可能性があります。それは間違いなくアプリケーションを壊す可能性があります.

于 2012-12-04T16:04:04.093 に答える