wake-up-neo.com

Visual Studio Installer> So starten Sie die App am Ende des Installationsprogramms

Dies ist wahrscheinlich eine dumme Frage und mein Googling funktioniert heute nicht mehr.

Ich habe eine Anwendung, der ich ein Visual Studio Installer> Setup Wizard Projekt hinzugefügt habe. Ich frage mich, wie Sie eine Schaltfläche oder ein Kontrollkästchen hinzufügen, mit der die Anwendung nach der erfolgreichen Installation gestartet wird. Dies befindet sich auf der letzten Seite des MSI-Installationspakets. Ich verwende Visual Studio 2010 Ultimate.

Ich brauche dies, damit das Installationsprogramm automatisch gestartet wird, wenn die Anwendung ein automatisches Update durchführt. Ich brauche nur das Installationsprogramm, um die App nach dem Update neu zu starten.

Das ist wahrscheinlich sehr einfach, aber für mein Leben kann ich es nicht herausfinden. Vielen Dank im Voraus für Ihre Hilfe.

44
ThaKidd KG5ORD

Um eine Anwendung nach Abschluss der Installation auszuführen, 

  1. Klicken Sie mit der rechten Maustaste auf Ihr Setup-Projekt, und klicken Sie auf Benutzerdefinierte Aktionen. 
  2. Klicken Sie dann mit der rechten Maustaste auf Festschreiben, Benutzerdefinierte Aktion hinzufügen, und wählen Sie die Datei aus, die Sie ausführen möchten. (Beachten Sie, dass es sich bereits in Ihrem Anwendungsordner befinden muss, was in Ihrem Fall kein Problem sein sollte, da Sie Ihr Programm trotzdem ausführen. 
  3. Wählen Sie einfach die Ausgabe Ihres Projekts.
  4. Klicken Sie dann auf diese hinzugefügte .exe-Datei und ändern Sie InstallerClass in false. Dies ist wichtig, da ansonsten nach einem Installationsprogramm gesucht wird.
  5. Sie könnten sogar Parameter an Ihre EXE-Datei übergeben, indem Sie sie der Arguments-Eigenschaft hinzufügen
84
sbenderli

In Visual Studio 2010 ist es einfach ...

Schritt 1: Fügen Sie dem Anwendungsprojekt, das Sie nach der Installation ausführen möchten, eine neue Installationsklasse hinzu. Rufen Sie es nach Ihren Wünschen auf.

Schritt 2: Fügen Sie der Installer-Klasse, die Sie gerade hinzugefügt haben, mit dem Namen MyApplication.exe den folgenden Code hinzu.

Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)

    MyBase.Commit(savedState)
    System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(Me.Context.Parameters("AssemblyPath")) + "\MyApplication.exe")

End Sub

Kompilieren und loslegen ...

7
Jarrod

In meinem Fall kämpfte ich eine Weile damit und die Lösung war einfach da. Die Lösung, die mit der benutzerdefinierten Aktion direkt für die primäre Ausgabe der Anwendung bereitgestellt wurde, war für mich nicht gut, da die Installations-App so lange verbleibt, bis Sie die Haupt-App verlassen. Das Problem könnte also mit dem nächsten Ansatz gelöst werden:

  1. Fügen Sie Ihrem Projekt eine Install-Klasse hinzu.
  2. Überschreiben Sie in der neuen Klasse die Commit-Methode, wie es Jarrod gesagt hat oben .

    System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(this.Context.Parameters["AssemblyPath"]) + @"\MyApplication.exe");

  3. Jetzt der Trick: Gehen Sie zum Bereich "Benutzerdefinierte Aktionen" im Installer-Projekt und fügen Sie die primäre Ausgabe Ihres Projekts in die Ordner "Commit" und "Install" ein. Ändern Sie nichts an den Eigenschaften. Es wird einfach so funktionieren. Standardmäßig wird die Installationsklasse abgerufen, in die Sie den Code im vorherigen Punkt eingefügt haben.
  4. Erstellen Sie Ihr Setup-Paket und installieren Sie es. Sie sollten beachten, dass die App am Ende startet.
  5. Schließen Sie einfach die Warnung über die erfolgreiche Installation und legen Sie los.

Um mehr darüber zu erfahren und woher ich es habe, besuchen Sie bitte this .

PS .: Ich habe es mit VS2017 und Framework 2.0 gemacht.

4
Artur Gomes

Versuchen Sie es in diesem Blogbeitrag: http://blogs.msdn.com/b/astebner/archive/2006/08/12/696833.aspx

Ich kann nicht bestätigen, ob es 2010 funktioniert oder nicht; Ich verwende immer noch 2008, bis mein TFS-Server aktualisiert wird. Ich benutze auch WiX für meine Installer. Es handelt sich jedoch nur um eine benutzerdefinierte Aktion. Ich denke, sie sollte noch unterstützt werden.

Hoffe das hilft!

(Übrigens, als ich beim Googeln dieses Problem gefunden habe, wurde Ihre Frage auf der ersten Seite von Google für diese Frage angezeigt.)

3
fire.eagle

Die Lösung von https://blogs.msdn.Microsoft.com/astebner/2006/08/12/mailbag-how-can-i-customize-an-msi-in-the-visual-studio-setupdeployment-project/ fügt am Ende des Setups ein Kontrollkästchen hinzu, um auszuwählen, ob Sie die Anwendung starten möchten oder nicht. Sie können das Skript so ändern, dass es standardmäßig geprüft wird ... oder es sogar ausblenden.

Der große Vorteil hier ist, dass die Anwendung nicht mit erhöhten Rechten ausgeführt wird, wie es von Maurice Flanagan erwähnt wurde.

Das benötigte Skript ist:

// EnableLaaunchApplication.js <msi-file>
// Performs a post-build fixup of an msi to launch a specific file when the install has completed


// Configurable values
var checkboxChecked = true;         // Is the checkbox on the finished dialog checked by default?
var checkboxText = "Launch [ProductName]";  // Text for the checkbox on the finished dialog
var filename = "WindowsApplication1.exe";   // The name of the executable to launch - change this to match the file you want to launch at the end of your setup


// Constant values from Windows Installer
var msiOpenDatabaseModeTransact = 1;

var msiViewModifyInsert         = 1
var msiViewModifyUpdate         = 2
var msiViewModifyAssign         = 3
var msiViewModifyReplace        = 4
var msiViewModifyDelete         = 6



if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view
var record

try
{
    var fileId = FindFileIdentifier(database, filename);
    if (!fileId)
        throw "Unable to find '" + filename + "' in File table";


    WScript.Echo("Updating the Control table...");
    // Modify the Control_Next of BannerBmp control to point to the new CheckBox
    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BannerBmp'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.StringData(11) = "CheckboxLaunch";
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Resize the BodyText and BodyTextRemove controls to be reasonable
    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyTextRemove'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(7) = 33;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyText'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(7) = 33;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Insert the new CheckBox control
    sql = "INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxLaunch', 'CheckBox', '18', '117', '343', '12', '3', 'LAUNCHAPP', '{\\VSI_MS_Sans_Serif13.0_0_0}" + checkboxText + "', 'CloseButton', '|')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    WScript.Echo("Updating the ControlEvent table...");
    // Modify the Order of the EndDialog event of the FinishedForm to 1
    sql = "SELECT `Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering` FROM `ControlEvent` WHERE `Dialog_`='FinishedForm' AND `Event`='EndDialog'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(6) = 1;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Insert the Event to launch the application
    sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'VSDCA_Launch', 'LAUNCHAPP=1', '0')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    WScript.Echo("Updating the CustomAction table...");
    // Insert the custom action to launch the application when finished
    sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('VSDCA_Launch', '210', '" + fileId + "', '')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();



    if (checkboxChecked)
    {
        WScript.Echo("Updating the Property table...");
        // Set the default value of the CheckBox
        sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('LAUNCHAPP', '1')";
        view = database.OpenView(sql);
        view.Execute();
        view.Close();
    }



    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}



function FindFileIdentifier(database, fileName)
{
    var sql
    var view
    var record

    // First, try to find the exact file name
    sql = "SELECT `File` FROM `File` WHERE `FileName`='" + fileName + "'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    if (record)
    {
        var value = record.StringData(1);
        view.Close();
        return value;
    }
    view.Close();

    // The file may be in SFN|LFN format.  Look for a filename in this case next
    sql = "SELECT `File`, `FileName` FROM `File`";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    while (record)
    {
        if (StringEndsWith(record.StringData(2), "|" + fileName))
        {
            var value = record.StringData(1);
            view.Close();
            return value;
        }

        record = view.Fetch();
    }
    view.Close();

}

function StringEndsWith(str, value)
{
    if (str.length < value.length)
        return false;

    return (str.indexOf(value, str.length - value.length) != -1);
}

Bearbeiten Sie die Datei, um den gewünschten Namen und den Namen der ausführbaren Datei anzuzeigen, setzen Sie diese Datei neben Ihr .vdproj-Setup-Projekt und fügen Sie in der Postbuild-Zeile folgende Zeile hinzu:

CALL cscript.exe "$ (ProjectDir) EnableLaunchApplication.js" "$ (BuiltOuputPath)"

0
JayTee

Hinzufügen einer weiteren Antwort, da keine der vorherigen Antworten das Kontrollkästchen oder die Schaltflächenfrage im ursprünglichen Beitrag anspricht.

Sie würden Ihrem Setup-Projekt einen der vorgefertigten Dialoge hinzufügen, etwa CheckBoxes (A), indem Sie mit der rechten Maustaste auf die Schaltfläche Start in der Ansicht der Benutzeroberfläche klicken. Klicken Sie nach dem Hinzufügen mit der rechten Maustaste auf das Dialogfeld, um es nach oben zu verschieben. Sie benötigen nur ein Kontrollkästchen für die Frage, um nach dem Ausführen des Programms zu fragen, um die anderen zu entfernen. Der Standardname der Eigenschaft ist CHECKBOXA1. Fügen Sie der benutzerdefinierten Aktion, die Ihren Code auslöst, eine Bedingung hinzu. 

0
PhilDW