34

いくつかのファイル(.NETプログラムバージョン6.0.0.0)をインストールする非常に単純なWiXプロジェクト(バージョン3.7)があります。WiXのMajorUpgrade機能を使用して新しいバージョン6.0.1.0をリリースする準備ができました。

Product要素でUpgradeCodeを同じに保ち、バージョンを6.0.0.0から6.0.1.0に変更します

<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me" 
       UpgradeCode="$(var.TheUpgradeCodeGUID)">

6.0.0.0がインストールされているマシンで、新しいインストーラーを実行します。

古いバージョン6.0.0.0の削除は正常に実行されます(インストールされているすべてのファイルが削除されます)が、インストーラーが新しいバージョンをインストールし続けると、サードパーティのDLLとサードパーティのEXEの2つのファイルが失われます(まだインストールされていません)。変更されました)は再インストールされていません。

<Component Id="AutomaticUpdaterWPF.dll" Guid="*">
        <File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" />
</Component>
<Component Id="wyUpdaterProgram" Guid="*">
        <File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" />
</Component>

<ComponentGroup>内の他のすべてのファイル(一部は変更済み、一部は未変更(他のサードパーティDLLを含む))は、メジャーアップグレード中に正しくインストールされています。

メジャーアップグレード後に「修復」をクリックすると、2つの欠落しているファイルが再表示されます。また、バージョン6.0.1.0を初めてインストールする場合(アップグレードはありませんが、最初にクリーンなマシンにインストールします)、これら2つのファイルは直接正常にインストールされます。(いくつかのWindowsマシン(XP、7、および8)でテスト済み)

誰かが何が間違っているのか、そしてそれを修正する方法を提案しますか?

4

6 に答える 6

30

提供されたログファイルは、すでにマシン上にあるいくつかのファイルの新しいバージョンを示しています。

MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {015A4DC1-56F4-562B-96B5-B3BE0D45FA5F} since the same component with higher versioned keyfile exists
MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {4B6A1404-3892-5BEF-AB47-8FE3149211A4} since the same component with higher versioned keyfile exists

私は過去にこのアップデーターでこの問題を見てきました。クリストファーは正しいです。アップデータはファイルを更新しましたが、MSIに通知しませんでした(MSIを更新しません。これは正しいことではありません)。新しいMSIは、新しいものがマシン上にあると見なし、ファイルをインストールしないことを選択しますが、アップグレード中に古いパッケージがファイルを削除します(バージョンが新しいことに気づきません)。新しいインストーラーがファイルをインストールしないことを選択したので、修復するまで何もありません。

この問題を回避するには、後でRemoveExistingProductsアクションを移動する必要があります。MajorUpgrade要素を使用している場合は、Schedule='afterInstallExecute'またはSchedule='afterInstallFinalize'そのトリックを実行する必要があります。コンポーネントルールにはもっと注意する必要があります。

また、サードパーティベンダーであるIMHOは、MSIの外部でファイルを更新しないでください。彼らの決定は、あなたの製品を特定のアップグレード方法に強制することです。

于 2013-02-28T15:52:54.153 に答える
5

ログファイルが役立ちます。私の推測では、RemoveExistingProductsをスケジュールした場所に基づいています。Costingが、インストールされているファイルがすでにインストールされているファイルと同じであると判断し、そのファイルをインストールしないことを決定する状況を見てきました。その後、メジャーアップグレードが発生し、ファイルがなくなります。ファイルが存在せず、コストがそれをインストールする必要があることを認識しているため、修復は機能します。

于 2013-02-28T15:10:28.723 に答える
5

私も同じ問題を抱えています。ここでの問題は、メジャーアップグレードを行うときに、msiが最初にインストールするコンポーネントをチェックし(そして、すでにインストールされているものよりも低いバージョンのすべてのdllが「インストールしない」とマークされている)、インストールされたアプリを削除してから新しいバージョンをインストールしますが、以前にマークされたコンポーネントなし。

「インストールの禁止(...)」は原価計算フェーズで行われ、MajorUpgradeはインストールフェーズでのみスケジュールできるため、REPの再スケジュールは役に立ちませんでした。

私の解決策は、wxsファイルでREINSTALLMODEプロパティを「amus」に設定することでした。

<Property Id="REINSTALLMODE" Value="amus" />

「a」は、バージョンに関係なく、すべてのdllが再インストールされることを意味します。

于 2019-09-24T14:07:31.750 に答える
2

この問題には別の解決策がありましたが、前の回答は確かに正しい方向を示していました。.NETプロジェクトのDLLには、以前のインストールよりも低いバージョン番号が割り当てられていました。AssemblyInfo.csファイルに移動し、3番目のオクテットを0から1にインクリメントすると、問題が解決しました。WixはDLLを新しいものとして認識しました。

[assembly: AssemblyVersion("1.0.1.*")]
于 2018-07-19T23:27:25.923 に答える
0

インストーラー5.0にはまだエラーがあり、問題があります。RemoveExistingProduct後に配置する回避策InstallFinalizeは、私たちにとって解決策ではありません。単一ファイルのプロパティ設定による更新を強制しました。

このソリューションは今私たちのために働いています。

于 2015-11-06T10:14:37.970 に答える
-1

古いバージョンのWindowsインストーラーでは、問題は次の場所に記載されています。

https://support.microsoft.com/en-us/kb/905238

影響を受ける製品のリストは、MSIエンジン4.0以降で修正されていることを示しています。OSバージョンに該当する場合は、インストールを実行する前に4.5再配布可能ファイルを使用すると役立つはずです。

于 2015-04-13T18:33:13.267 に答える