Ist es in Ordnung, die benutzerdefinierte Aktion RemoveExistingProducts vor InstallValidate zu planen?

8

Problem

Ich habe ein MSI, das während der Installation einen Windows-Dienst erstellt und startet und den Dienst während der Deinstallation stoppt und entfernt. Dies funktioniert gut bei der Installation und Deinstallation von selbst, aber beim Upgrade wird der Dateien in Verwendung -Dialog angezeigt (nur auf Vista und später aufgrund der neuen Neustart-Manager ), um anzuzeigen, dass der Dienst verwendet wird.

Hintergrund

Das Dialogfeld Verwendete Dateien wird während der InstallExecute -Sequenz von InstallValidate benutzerdefinierte Aktion, die unmittelbar vor dem EntfernenExistierendeProdukte benutzerdefinierte Aktion; Das bedeutet, dass die vorherige Version noch nicht deinstalliert wurde, daher sollte der Dateien in Verwendung -Dialog angezeigt werden .

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

Mögliche Lösung

Ich möchte die benutzerdefinierte Aktion RemoveExistingProducts unmittelbar vor der benutzerdefinierten Aktion InstallValidate verschieben, damit die vorherige Installation die Möglichkeit hat, den Dienst vor dem << Dateien in Verwendung -Dialog wird angezeigt. Ich habe versucht, die Aktionen neu zu planen, und es scheint ordnungsgemäß zu funktionieren, ohne nachteilige Nebenwirkungen (obwohl das Protokoll weiterhin anzeigt, dass die Aktion InstallValidate vor der Aktion RemoveExistingProducts ausgeführt wird) Ich zögere, diese Lösung zu verwenden, da sie gegen die MSDN-Dokumentation verstößt und es möglicherweise negative Auswirkungen gibt, die ich gerade noch nicht sehe.

Hat jemand das versucht? Die einzige andere Alternative, die ich mir vorstellen kann, ist, dass die neue Installation den Dienst der alten Installation stoppt, aber dies ist unerwünscht, da die Installation Informationen über alle alten Installationen haben muss, die aktualisiert werden können als nur einen einfachen Aufruf an den Service Manager, um es zu stoppen).

    
Kevin Kibler 13.01.2010, 15:42
quelle

4 Antworten

6

Ich habe die in der Frage beschriebene potenzielle Lösung implementiert und RemoveExistingProducts unmittelbar vor InstallValidate geplant. Ich habe noch keine Probleme gesehen, aber ich werde wieder posten, nachdem die Installation mehr genutzt wird.

Aktualisieren

Unsere Installation verwendet dies seit einiger Zeit und ich habe keine negativen Auswirkungen bemerkt.

    
Kevin Kibler 16.02.2010, 15:13
quelle
1

Es wurde bereits in den MSI / Windows Installer eingebaut ... Das einzige Problem ist, dass die .NET Installer Klassen nicht die MSI "Service Installation" Funktionen verwenden. Tatsächlich versucht das MSI, Dateien zu installieren und einen benutzerdefinierten Befehl mithilfe der soeben kopierten Dateien auszuführen (das ist alles, was Visual Studio in das MSI einfügt).

Um es zu lösen, können Sie das MSI mit ORCA bearbeiten und die folgende Zeile zum ServiceControl hinzufügen Tabelle:

%Vor%

Die Komponenten-ID, die Sie aus der FILES-Tabelle suchen können ... Ich habe nur die Komponenten-ID der Haupt-EXE-Datei gewählt. Die 170 ist eine Bitmap, die Windows Installer anweist, den Dienst beim Installieren und Deinstallieren zu beenden und zu löschen.

Dies wird den Weg für die .NET-Installationsprogramme zum Hinzufügen von Diensten freimachen und Sie können den ServiceController verwenden, um den Dienst zu starten, nachdem er über einen benutzerdefinierten Befehl installiert wurde.

    
Daryl 07.04.2011 04:58
quelle
0

Ein mögliches Problem wäre, dass wenn der Benutzer während InstallValidate abbricht (z. B. wegen nicht genügend Speicherplatz oder einer verwendeten Datei) oder während der Installation, was ist das Rollback-Verhalten. Die ideale Situation besteht darin, dass der Anwendungszustand derselbe ist wie zuvor (z. B. wenn die vorherige Anwendung installiert ist). Möglicherweise geben Sie dies mit Ihrer Sequenzierung auf, obwohl Rollback eine Funktion sein kann, ohne die Sie leben können.

    
Edward Brey 28.01.2010 22:24
quelle
0

Ich denke, dieser wird Ihnen helfen, ohne die MSDN-Dokumentation zu verletzen und zukünftige Probleme zu vermeiden. Setzen Sie eine Bedingung "Installiert oder PREVIOUSVERSIONSINSTALLED" und Sie werden auch gut zu aktualisieren, da die Eigenschaft PREVIOUSVERSIONSINSTALLED vor InstallValidate Aktion während FindRelatedProducts festgelegt ist. Ich weiß nicht warum, aber die Eigenschaft PREVIOUSVERSIONSINSTALLED ist nicht in MSDN dokumentiert, aber sie existiert und ist sehr hilfreich für mich.

    
IgorB 20.12.2013 20:31
quelle