インストーラーと一緒に出荷されていた製品があり.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で可能であればどちらかのオプションを検出したいと思います。