0

私はWiX3.6を使用して、いくつかのexeとdllをコピーし、いくつかのWindowsサービスをインストールし、いくつかのレジストリエントリを追加および削除するmsiを作成しています。

WiXは素晴らしく、関連付けられた.netマネージDLLに組み込まれている機能とカスタムアクションを使用して、必要なすべてのことを非常に簡単に実行できました。

しかし、最近、1つの厄介な問題が発生し始めました。

インストールはエラーなしで進行し、期待どおりに実行されますが、[プログラム機能]コントロールパネルまたはコマンドラインからアンインストールすると、製品エントリが[プログラム機能]リストに残ります。他のすべてのファイル、サービス、およびフォルダーは期待どおりに削除され、アンインストールはエラーが報告されることなく完了します。

アンインストールを2回実行すると、プログラム機能のエントリが削除されます。

インストールとアンインストールの詳細ログを使用し、プラットフォームSDKのWindowsインストーラー詳細ログアナライザーで両方を表示しましたが、エラーは報告されません。

困惑しました!

以前は正しくアンインストールされていたと思いますが、この動作を示し始めるために何をしたかを特定できません。

任意のアイデアをいただければ幸いです。

PS私はWindows764ビットマシンで実行していて、32ビットインストーラーを生成しています。

PPSログは大きすぎてここに含めることができません。プログラム機能リストからのエントリの削除を制御する、確認する必要のあるエントリを誰かにアドバイスできますか?

さらなる解明;

以下のクリストファーの回答からリンクを確認しましたが、状況は私のものと一致しませんでした。

最初のアンインストール後、エントリは[プログラム機能]リストに表示されなくなりますが、更新されるか、コントロールパネルを終了して戻ってくると、リストに再表示されます。レジストリエントリはまだ存在しているので(確認しました)、これがリストに表示される理由です。

2回目のアンインストールでは、レジストリからエントリが削除され、リストからも削除されます。

4

3 に答える 3

3

最近msiに加えた変更をたどり、アンインストールがおかしな動作をする原因となった変更を発見しました。

いくつかの古いレジストリエントリを削除する機能を作成しましたが、最初のインストール時にそれを行うだけでよいので、次のように機能に条件を設定しました。

<Feature Id="RegistryEntries" Level="0">
        <Condition Level="1">(NOT Installed)</Condition>
        <ComponentRef Id="RegKeysToDelete"/>
</Feature>

条件がない場合、msiは期待どおりにインストールおよびアンインストールされます。

上記の条件では、正しくインストールされ、レジストリキーが削除されますが、アンインストールすると[プログラムの追加と削除]のエントリが残り、完全に削除するにはもう一度アンインストールする必要があります。

次の条件を使用すると、msiは期待どおりにインストールおよびアンインストールされます。

<Feature Id="RegistryEntries" Level="0">
        <Condition Level="1">(NOT Installed) OR REMOVE ~= "ALL"</Condition>
        <ComponentRef Id="RegKeysToDelete"/>
</Feature>

これらのレジストリキーを使用してアンインストールする必要がないため、最初はアンインストールに対応しませんでした。これで問題は解決しましたが、最初の条件が1に評価されないために、msiが期待どおりにアンインストールされない理由はわかりませんが、それは別の質問だと思います...

MSDNトピックの条件テーブル(Windows)(備考セクション)を参照してください。

インストール時に機能が有効にならず、アンインストール時に機能が無効にならないように、条件を慎重に選択する必要があります。これにより機能が孤立し、製品をアンインストールできなくなります。

于 2013-02-05T16:17:11.283 に答える
1

これは、プログラムの追加と削除(Windowsシェルチーム)のバグです。ARPを閉じるか更新すると、エントリが消えるのがわかります。MSI(Windowsインストーラチーム)に問題はない可能性があります。

チェックアウト:

アンインストーラーを終了した後も、プログラムがプログラムと機能フォルダーに表示されるのはなぜですか?

WiXに関連するスレッドは次のとおりです。

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/quot-Add-Remove-Programs-quot-doesn-t-refresh-sometimes-td6918973.html

ところで、実際にはアンインストーラーを2回実行しているわけではありません。アンインストールボタンをクリックするだけで、ARPは「もう存在しない」と認識し、削除されます。アンインストールは実際には呼び出されません。

于 2013-02-01T12:18:35.043 に答える
0

これは実際には「答え」ではありませんが、大幅に編集されたログから私が見たいくつかのアーティファクトを置く場所です。

ファーストラン:

(状態)MSI(s)(B4:3C)[09:18:48:395]:機能:StartServices; インストール済み:ローカル。リクエスト:Null; アクション:ヌル

(状態)MSI(s)(B4:3C)[09:18:48:395]:機能:構成; インストール済み:ローカル。リクエスト:欠席。アクション:不在

(状態)MSI(s)(B4:3C)[09:18:48:395]:機能:データベース; インストール済み:ローカル。リクエスト:欠席。アクション:不在

(状態)MSI(s)(B4:3C)[09:18:48:395]:機能:RegistryEntries; インストール済み:ローカル。リクエスト:Null; アクション:Null(STATE)MSI(s)(B4:3C)[09:18:48:395]:機能:実行可能ファイル; インストール済み:ローカル。リクエスト:欠席。アクション:不在(STATE)MSI(s)(B4:3C)[09:18:48:395]:機能:完了。インストール済み:ローカル。リクエスト:欠席。アクション:不在(STATE)MSI(s)(B4:3C)[09:18:48:395]:機能:サービス; インストール済み:ローカル。リクエスト:欠席。アクション:不在(STATE)MSI(s)(B4:3C)[09:18:48:395]:機能:DLL; インストール済み:ローカル。リクエスト:欠席。アクション:不在

2回目の実行:

(状態)MSI(s)(48:0C)[09:33:17:664]:機能:StartServices; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:構成; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:データベース; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:RegistryEntries; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:実行可能ファイル; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:完了; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:サービス; インストール済み:なし。リクエスト:Null; アクション:Null(STATE)MSI(s)(48:0C)[09:33:17:664]:機能:DLL; インストール済み:なし。リクエスト:Null; アクション:ヌル

結論はわかりません。最初のログには、特定の機能がインストールされており、削除が要求されていないことが示されています。2番目のログには、機能がインストールされておらず、要求が行われていないことが示されています。2番目のログで、すべての機能がインストールされていないと言うことができるのに、インストールを削除する方法について少し困惑しています。

これは私が今まで見たことがない新しいものであるか、ログが大幅に編集されているか、状況を表していないために誤って誤解を招く可能性があります。

于 2013-02-05T13:11:26.217 に答える