Ist es in Ordnung, Zeitplan RemoveExistingProducts benutzerdefinierte Aktion vor InstallValidate?

StackOverflow https://stackoverflow.com/questions/2057936

  •  20-09-2019
  •  | 
  •  

Frage

Problem

Ich habe ein MSI, die erstellt und startet einen Windows-Dienst während der Installation und stoppt und entfernt den Dienst bei der Deinstallation. Dies funktioniert gut, wenn die Installation und Deinstallation von selbst, aber wenn die Umrüstung, die Dateien im Einsatz Dialog angezeigt wird (nur auf Vista und später aufgrund des neuen Restart Manager ), was darauf hinweist, dass der Dienst in Betrieb ist.

Hintergrund

Die Dateien im Einsatz Dialog während der angezeigt wird InstallExecute Sequenz durch die InstallValidate benutzerdefinierte Aktion, die unmittelbar vor dem RemoveExistingProducts benutzerdefinierte Aktion; Dies bedeutet, dass die vorherige Version noch nicht deinstalliert wurde, so dass die Dateien im Einsatz Dialog sollte angezeigt.

Die MSDN-Dokumentation gibt an, dass die RemoveExistingProducts Aktion muss nach der InstallValidate Aktion geplant werden, und ich habe zur Zeit der RemoveExistingProducts Aktionen geplant unmittelbar nach InstallValidate Aktion.

Mögliche Lösung

Ich mag die RemoveExistingProducts benutzerdefinierte Aktion unmittelbar vor der InstallValidate benutzerdefinierte Aktion neu zu planen, so dass die vorherige Installation eine Chance zu Anschlag und entfernen Sie den Dienst vor dem < strong> Dateien im Einsatz Dialog gezeigt. Ich habe versucht, die Aktionen Umschuldung, und es scheint, ohne negative Nebenwirkungen richtig zu arbeiten (obwohl das Protokoll gibt nach wie vor, dass die InstallValidate Aktion wird vor der RemoveExistingProducts Aktion), aber ich bin zögerlich, diese Lösung zu verwenden, da es in der MSDN-Dokumentation verletzt, und es kann schädliche Wirkungen sein, dass ich nur noch nicht sehen.

Hat jemand versucht? Die einzige andere Alternative, die ich denken kann, ist die neue Installation in den Dienst der alten Anlage zu stoppen zu haben, aber dies ist nicht wünschenswert, weil es die Installation erfordert Informationen über alle alten Anlagen haben, dass es (Stoppen dieser bestimmten Dienst upgraden kann es sich um mehr als nur um es zu stoppen einen einfacher Anruf zum Service Manager).

War es hilfreich?

Lösung

I implementiert, um die mögliche Lösung in der Frage dargelegt, Scheduling RemoveExistingProducts unmittelbar vor dem InstallValidate . Ich habe keine Probleme noch nicht gesehen, aber ich werde nach wieder nach der Installation mehr Einsatz kommt.

Aktualisieren

Unsere Anlage ist seit einiger Zeit mit diesem, und ich habe keine negativen Auswirkungen bemerkt.

Andere Tipps

Die bereits in die MSI / Windows Installer gebaut ... das einzige Problem ist, dass die .NET-Installer-Klassen verwendet nicht die MSI „Service Installation“ Funktionen. Was tatsächlich passiert ist, dass die MSI versucht, Dateien zu installieren und einen benutzerdefinierten Befehl, die Dateien nur kopiert laufen (die alles Visual Studio ist in der MSI setzen).

Um es zu lösen Sie das MSI mit ORCA bearbeiten und fügen Sie die folgende Zeile in die Servicecontrol Tabelle:

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

Die Komponenten-ID können Sie aus der Tabelle FILES Nachschlag ... Ich wähle nur die Hauptkomponente IDs EXE-Datei. Die 170 ist ein Bitmap, das Windows Installer zu beenden und löschen Sie den Service sagt, wenn Installation und Deinstallation.

Damit wird der Weg frei für die .NET-Installateure Dienst hinzuzufügen und Sie können die Servicecontroller verwenden den Dienst zu starten, nachdem es über benutzerdefinierte Befehl installiert worden ist.

Ein mögliches Problem wäre, dass, wenn der Benutzer während InstallValidate annulliert (beispielsweise aufgrund von nicht genügend Speicherplatz oder eine Datei in Verwendung) oder während der Installation, was das Rollback-Verhalten. Die ideale Situation ist, dass der Anwendungszustand die gleiche ist, wie es vorher war (beispielsweise die frühere Anmeldung installiert ist). Sie könnte sein, dass Sie sich mit Ihrer Sequenzierung geben, obwohl Rollbacks ein Feature sein können Sie ohne leben können.

ich denke, das wird man Ihnen helfen, ohne Dokumentation MSDN zu verletzen und vermeiden Sie zukünftige Probleme. Legen Sie eine Bedingung „Installiert OR PREVIOUSVERSIONSINSTALLED“ und Sie werden gut sein, auch auf ein Upgrade, da die Eigenschaft PREVIOUSVERSIONSINSTALLED vor InstallValidate Aktion während FindRelatedProducts gesetzt. Ich weiß nicht, warum, aber die Eigenschaft PREVIOUSVERSIONSINSTALLED nicht in MSDN dokumentiert, aber es gibt sie und sehr hilfreich für mich aber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top