Setup-Projekt mit benutzerdefiniertem Formular

8

Ich arbeite gerade an einem Visual Studio 2010-Setup-Projekt und würde gerne wissen, ob das Folgende möglich ist:

1) Führen Sie das Setup-Projekt so aus, dass die Standardformulare nicht angezeigt werden. Stattdessen würde ich mein eigenes benutzerdefiniertes Formular anzeigen, das Setup-Projektereignisse abonniert. Auf diese Weise würde ich Installationsmeldungen anzeigen und meinen eigenen Fortschrittsbalken erhöhen.

2) Wenn 1 möglich ist, würde ich einen Weg brauchen, um den Standardort anzugeben.

3) Ich habe ein separates Bibliotheksprojekt, in dem ich eine benutzerdefinierte Installationsklasse (von "System.Configuration.Install.Installer" geerbt) aus dem Installationshandler habe, die ich benutzerdefinierte Windows-Formulare anzeigen lassen könnte, und Kontrollmöglichkeiten, die vom Benutzer getroffen werden. Ich denke, das ist möglich, indem man einen Verweis auf system.windows.forms hinzufügt, aber wäre dies der richtige Weg, dies zu tun? Wenn ich das Standardinstallationsformular nicht ausblenden könnte, würden diese benutzerdefinierten Formulare über der Standardinstallation angezeigt und ich denke, es würde zu groß aussehen.

Vorschläge, Links usw. geschätzt Danke!

* UPDATE 1 *

Könnte ich eine .msi-Datei aus c # -Code starten, aber auch einen Wert übergeben?

Was macht dieser Typ hier? link

Aber ich übergebe einen Wert ... dann mache ich von meiner benutzerdefinierten Installationsklasse abhängig von diesem Wert Aktionen.

UPDATE 2

Scheint so, als könnte ich: Linkcode-Projekt

UPDATE 3

Ich überlege, wie ich das Folgende tue, ich werde mit einer winforms-App testen.

1) Winforms-Anwendung starten.
2) Machen Sie ein paar WebService-Aufrufe, zeigen Sie Daten an, der Benutzer trifft eine Auswahl.
3) Gemäß Link in Update 1, Start-Prozess (Silent-Modus) und pro Update 2, übergeben Sie ausgewählte Werte.
4) Verwenden Sie einen Cross-Process-Event-Mechanismus (WCF), damit meine benutzerdefinierte Installationsklasse das Formular für die verschiedenen Schritte zur Ausführung und Aktualisierung der Fortschrittsanzeige und der Nachrichten benachrichtigen kann.

    
rauland 19.02.2011, 20:05
quelle

2 Antworten

2

Sie können benutzerdefinierte Formulare erstellen , aber die Deklaration muss innerhalb von MSI erfolgen. Sie können einen benutzerdefinierten Dialog über eine benutzerdefinierte Aktion anzeigen, aber das wird Ihnen nicht viel helfen, da MSI dies tut:

  1. Benutzerdefinierte dll-Datei laden
  2. Wenn es verwaltet wird, wird die CLR gestartet und Ihr Maanged-Code ausgeführt
  3. Wenn die benutzerdefinierte Aktion verlassen wird, wird die DLL entladen und die CLR wird heruntergefahren

Dies geschieht jedes Mal, wenn eine benutzerdefinierte Aktion aufgerufen wird. Dies ist einer der Hauptgründe, warum benutzerdefinierte Aktionen normalerweise in C ++ geschrieben werden.

Um flexibler zu sein, sollten Sie das WIX -Toolkit verwenden, das die .NET-Integration so gut wie möglich mit MSI ermöglicht. MSI selbst weiß nichts über .NET und ist eine eigene Welt. MSI selbst definiert Dialoge und Steuerelemente innerhalb der MSI über Tabellen wie den Dialog und Kontrolle Tabelle. Sie könnten einen Dialog erstellen und Ihren Status in einer MSI-Eigenschaft zwischen jeweils mehreren MSI-Aktionen speichern, die z. um den Speicherplatz für die ausgewählten Funktionen zu berechnen und so weiter. Aber ich bezweifle, dass diese Lösung leistungsfähig sein wird und ich befürchte, dass das Starten und Herunterfahren der CLR so oft in einem Prozess Sie CLR-Fehlern aussetzt, die niemand zuvor gesehen hat.

Um den Zielspeicherort festzulegen, müssen Sie nur die MSI-Methode aufrufen MsiSetTargetPath , die Sie ganz einfach aufrufen können.

Um die normale Benutzeroberfläche zu deaktivieren, können Sie sie ganz oder teilweise überschreiben MsiSetExternalUI , aber ich habe nicht versucht, nur bestimmte Dialoge zu deaktivieren. Wenn Sie bestimmte Dialoge ausblenden möchten, sollten Sie die MSI-Tabellen Ihrer aktuellen MSI überprüfen, um zu überprüfen, ob Sie eine msi-Eigenschaft festlegen können, damit der Dialog denkt, dass er bereits angezeigt wurde.

Mit freundlichen Grüßen   Alois Kraus

    
Alois Kraus 19.02.2011 20:40
quelle
1

Soweit ich weiß, sind die von Visual Studio erstellten Setup-Projekte sehr begrenzt, wenn Sie nicht benutzerdefinierte Aktionen . Diese benutzerdefinierten Aktionen können viel Zeit zum Erstellen und Debuggen benötigen, sodass es möglicherweise sinnvoller ist, ein ausgereifteres / besser funktionierendes Tool wie zu verwenden Installshield

BEARBEITEN Wie das Anzeigen von Fenstern mit Winforms: das ist in Ordnung, aber: ein nettes Setup erlaubt eine stille / skriptbasierte Installation, stellen Sie sicher, dass Sie dies zulassen. Eine andere Sache, auf die man achten sollte, ist, dass die Maschinen nicht .NET haben und daher nicht in der Lage sind, die Forms zu zeigen ... IMHO, das ist ein No-No, bis Sie sicher sind, dass .NET (korrekte Version) vorhanden ist.

BEARBEITEN 2 Als Antwort auf einige Kommentare: Es gibt einige Szenarios, die mit VISUAL STUDIO Setup- und Bereitstellungsprojekten nicht implementiert werden können. Ich sage nicht, dass Windows Installer schlecht ist. Z. B. Versuchen Sie, ein benutzerdefiniertes Installationsprogramm zu erstellen, um zu entscheiden, wo eine Anwendung installiert wird, und das Standardfenster zu überspringen, das das Projekt generiert. Ich sage nicht, dass benutzerdefinierte Aktionen begrenzt sind, aber sie sind auch nicht einfach.

Wenn Sie benutzerdefinierte WinForms anstelle von Installer-Formularen verwenden möchten, müssen Sie außerdem sicherstellen, dass der Bootstrap des .NET-Frameworks ausgeführt wird, BEVOR Sie (WinForm) -Fenster anzeigen. Es könnte möglich sein, aber wenn Sie solche Anpassungen wünschen, können Sie besser mit einem flexibleren Werkzeug umgehen.

    
Erno de Weerd 19.02.2011 20:10
quelle