2016-10-05 13 views
0

私はInstallShieldでビルドされた製品AとWiXでビルドされた製品Bの2つのmsiインストーラを持っています。製品Bは製品Aの上を走るはずでしたが、最近、一部のコードXがBからAに移行しました。複数のmsiインストーラが同じディレクトリにインストールされています

新規インストールでは問題は発生しません。それでも、A.1とB.1がインストールされているサーバー(.1 =バージョン1)にXがBからインストールされていると仮定しましょう。次にXを含むA.2をインストールするとしましょう。

コードXは更新されますか? A.2またはB.1をアンインストールしようとするとどうなりますか?これはまったく許可されていますか?それをどうすれば実現できますか?

+0

大きな疑問は、InstallShieldインストールがMSIベースのインストールかどうかです。それは答えに大きな違いをもたらします。 – PhilDW

答えて

0

これは主にあなたが非常にはっきりと述べていないいくつかの事柄に大きく左右されますので、ちょっと試してみましょう。バージョン1では、すべてのファイルがインストーラー間で一意であるか、適切に共有されていることを前提としています。マイグレーションについてのコードとは関係がありません(この質問では無視できます)。

ケース1:コードXは、DLL間で移行します。 Aはa.dllをインストールします。 Bはb.dllをインストールし、コードはb.dllからa.dllに移動します

この場合、2つの製品にコールチェーンがないと仮定すると、特別なことはありません。単にA.2をa.dllを次のバージョンに置き換え、B.2はb.dllを次のバージョンに置き換えます。インストールの順序やDLLの複数の所有権については何の懸念もありません。

この方法は、DLLのバージョン管理によってDLLを適切に置き換えることができる限り、どのような種類のアップグレードでも機能するはずです。

公開されたインターフェイス(COMクラスなど)がある場合、a.dllがa.dllを取得する前にb.dllが登録参照を放棄するように更新が必要な場合がありますが、これらの変更はコンポーネントに違反しますルール

ケース2:コードXのdllがインストーラ間で移行します。 Bはc.dllをインストールし、そのDLLは代わりにAによってインストールされます

この場合、成功は初期のオーサリングの品質によって決まります。 c.dllがそれ自身のコンポーネントによってインストールされ、共有とマークされている場合は、そのコンポーネントをAに追加することができます(設定に一致します)。最初にA.2をインストールすると、リファレンスカウントに追加されるため、B.2を参照すると参照は解除されますが削除されません。 B.2を最初にインストールすると、一時的にc.dllが削除されますが、A.2をインストールすると復元されます。アンインストールは同様に機能し、参照カウントを追跡し、必要に応じて削除します。

しかし、これは大きなアップグレードを前提としています。マイナーアップグレード(.mspまたは.msiとして提供されているかどうか)を使用している場合は、はるかに難しい状況にあります。 Bのアップグレードパスをきれいにするには、c.dllコンポーネントを保持したまま、c.dllを削除する別の方法を選択する必要があります。しかし、私が知っているすべてのアプローチは、同じ場所の同じコンポーネントの正確なコピーをインストールするAと競合します。この場合、最初にB.2をインストールする必要がありますが、2番目にインストールするとc.dllが削除される可能性があります。

マイナーアップグレードが正しく機能する場合は、パッチのアンインストールのケースも考慮する必要がありますが、そうではないため、ここでは説明しません。

関連する問題