2017-09-06 29 views
0

私は、MSI、C#カスタムアクションプログラム、UI、ブートストラップの束を使用するWiXの大きなプログラムを持っています。WiX:メジャーアップグレードでどのファイルが上書きされていないかを知る方法はありますか?

私はこの問題を抱えています。メジャーアップグレードを実行すると、以前のバージョンは消去されていません。つまり、バージョン1.0.0.xから1.1.0.xにアップグレードする場合、プログラム&機能は、両方のバージョンがマシンにインストールされていることを示しています。

これは一般的な問題です。多くの解決策がここにあります。彼らの誰も私のために働いていません - もしこれについての投稿があれば、試してみました。

メジャーアップグレードのコンポーネント間に1対1の関係があると言われました。つまり、削除されるコンポーネントごとに、別のコンポーネントを追加する必要があります。それが1対1の関係でない場合は、旧バージョンが削除されない場合です。古いコンポーネントがまだぶら下がっているためです。

どのコンポーネントが掛かっているかを判断する方法はありますか?ログファイルや何かのように?私はMSIが問題を抱えているかどうかを判断できれば、問題を解決するのにもっと積極的になるだろう。


EDIT:

私は問題を解決していないが、氏Urmanの提案のおかげで、私は正しい軌道上にあってもよいです。

私はそのレジストリキーを作成しましたが、何もしていないようです。しかし、私は言葉「禁止」のための私のアンインストールログを検索しなかった、と私はこのフレーズは9回が見つかりました:

PROPERTY CHANGE: Adding INSTALLLEVEL property. It's value is '1'. 

Disallowing uninstallation of component: {GUID-HERE} since another client exists. 

また、このフレーズは、「許可しない」というフレーズの各グループの前に表示されます

これは私に何かを与えます。しかし、私は言及されているGUIDを見つけることができない!彼らは私の解決策でもなく、レジストリで検索することもできません。レジストリを検索するほかに、特定のGUIDがどのコンポーネントに対応しているかを調べる方法(Windows 7 32ビット)がありますか?

答えて

1

メジャーアップグレードのコンポーネント間に1対1の関係があると言われました。つまり、削除されるコンポーネントごとに、別のコンポーネントを追加する必要があります。それが1対1の関係でない場合は、旧バージョンが削除されない場合です。古いコンポーネントがまだぶら下がっているためです。

これは厳密には当てはまりません。 マイナーアップグレードのかなりの事実であり、特定の構成(遅いRemoveExistingProductsを含むもの)でメジャーアップグレードはちょっと厄介です。しかし、あなたの典型的なメジャーアップグレード機能は、ユーザーが以前のバージョンをアンインストールしてから、新しいバージョンをインストールするように選択したようなものです。まず、適切なメジャーアップグレードがあることを確認します(ProductVersionとProduct Codeを変更して、アップグレードテーブルに正しいエントリがあることを確認してください)。その後、診断します。

何が起こっているのかを特定するにはどうすればよいですか?私の経験上、ログファイルが最善の策です。古いバージョンは間接的にアンインストールされるため、コマンドラインを使用してログオンすることはできません。代わりに、次のレジストリ値を作成または設定してLogging policyを設定します。 (設定を元に戻すときは後で削除してください。)

HKEY_LOCAL_MACHINE \ SOFTWARE \ポリシーは、Microsoft \ Windowsの\インストーラを\
値(REG_SZ):
データロギング:

voicewarmupと続いて適切なログファイルを見つけ、あなたのメジャーアップグレードを実行します%temp%で生成されました。 (これは、%temp%を事前に削除しておくほうが簡単です。日付別に並べ替えることをお勧めします)。特に、ProductVersionまたはUPGRADINGPRODUCTCODEの存在を確認できます。 コンポーネントのアンインストールを禁止します...にコンポーネントGUIDが含まれています。

GUIDを取得したら、そのコンポーネントとそのコンポーネントの現在の状態を把握する必要があります。構成された.msiファイル(Orcaのようなツールを使用して)を手動で調べてコンポーネントを見つけることはできますが、すべてのクライアントを示すツールはほとんどありません。私の雇用主の製品には、InstallShield Msi Sleuthというヘルパーツールが付属しています。このツールは、コンポーネントコードを参照してインストールされているすべての製品を一覧表示することも、MsiEnumProductsまたはInstaller.ComponentClientsから独自にビルドすることもできます。 WindowsインストーラはGUIDを圧縮形式またはパック形式で格納するため、レジストリを直接検索することはできません。

次に、「なぜ」が困難な部分である可能性があるかを特定します。または、特に、製品のリリースされていないバージョンを見たテストマシンでのみこれを検出した場合は、不正な共有DLL参照カウントと同じくらい簡単です。

マイナーアップグレードまたは小規模アップデートにのみ関連する関連する代替方法として、EnforceUpgradeComponentRules Policyを設定することができます。これは、Windowsインストーラがとにかく続けるのを最善にするのではなく、ヒットしたときに問題を明らかにするのに役立ちます。

+0

メジャーアップグレードは間違いありませんが、私の製品バージョン番号の一部は変更されませんが、そのMSIを最初のインストールにのみインストールする必要があるためです。私は、レジストリにそのロギングポリシーのパスについての質問があります。最後の "フォルダ" - インストーラ - が自分のマシン(仮想マシンWin 7 32ビット)にありません。それを手動で作成し、手動で作成した "Installer"フォルダの中に値/データタプルを作成する必要がありますか? – Bob

関連する問題