1

バージョン 1.1 をインストールしています。バージョン 1.2 でアップグレードを作成しました。両方の製品に 2 つのファイルがあります。

    <Component Win64="yes" Id="cmpFILE1" Guid="*">
  <File Id="filFILE1" KeyPath="yes" Source="$(var.BasePathCMP)\Performance.dll" />
</Component>
<Component Win64="yes" Id="cmpFILE2" Guid="*">
  <File Id="filFILE2" KeyPath="yes" Source="$(var.BasePathCMP)\LockLib.dll" />
</Component>

アップグレード中、LockLib.dll は削除され、置き換えられません。1.2のクリーンインストールでは存在します。その動作の原因は何ですか?

4

2 に答える 2

0

これが発生する理由の 1 つは、インストール パッケージがアップグレードを実行した後にアクション RemoveExistingProducts が実行されているためです。この場合、MSI はファイルが以前のバージョンと同じであることを検出し、削除します。あなたは出来る:

  1. RemoveExistingProducts の順序を変更する
  2. DLL を共有に設定します。

オプション1をお勧めします。

RemoveExistingProducts 要素

于 2014-05-20T18:25:48.380 に答える
0

古い MSI とアップグレードされた MSI の両方にあるファイルのコンポーネント GUID を変更したと思います。RemoveExistingProducts がインストールの終わりに近づくと、アップグレードはマージのように動作し、必要に応じてファイルを上書きし、共有コンポーネント GUID の参照カウントを増やします。最後に、REP は古い製品を削除し、コンポーネント GUID の参照カウントを減らします。GUID のクライアントがなくなった場合は削除されます。「共有」ファイルの GUID が変更された場合、それ以上のクライアントがなくなり、削除されます。最後の REP に関することは、コンポーネント共有ルールに従う必要があるということですが、アップグレードの開始時に REP をシーケンスする場合はそうしません。

今後の参考のために例を追加します。

最初のインストールに 3 つのファイル A、B、C、および 1、2、3 の 3 つの GUID があるとします。アップグレードには同じ 3 つのファイルがありますが、GUID は 1、2、8 です。REP が最後にある場合、アップグレードはインストールされます。最初に古い製品の上。Guid 1 と 2 の参照カウントは 1 から 2 に増加します。Guid 3 は 1 のままです。その後、古い製品がアンインストールされます。Guid 1 と 2 は ref が 1 にカウントダウンされますが、それらはまだ使用されているため、コンポーネント GUID に添付されたファイルは残ります。Guid 3 はゼロになり、ref カウントがないためコンポーネントは削除されますが、ファイル C に添付されているため、インストールしたばかりでも C は削除されます。

于 2014-05-20T19:26:31.707 に答える