web-dev-qa-db-fra.com

Programme d'installation de Visual Studio> Comment lancer l'application à la fin du programme d'installation

Ceci est probablement une question stupide et mon google ne fonctionne tout simplement pas aujourd'hui.

J'ai une application à laquelle j'ai ajouté un projet Visual Studio Installer> Setup Wizard. Je me demande comment ajouter un bouton ou une case à cocher qui lancerait l'application après une installation réussie. Ce serait situé sur la dernière page du package MSI Installer. J'utilise Visual Studio 2010 Ultimate.

J'ai besoin de cela pour que, lorsque l'application effectue une mise à jour automatique, elle lance automatiquement le programme d'installation. J'ai juste besoin du programme d'installation pour relancer l'application après la mise à jour.

Ceci est probablement très simple mais pour la vie de moi je ne peux pas le comprendre. Merci d'avance pour votre aide.

44
ThaKidd KG5ORD

Pour exécuter n'importe quelle application une fois l'installation terminée, 

  1. Cliquez avec le bouton droit sur votre projet d'installation, cliquez sur Actions personnalisées. 
  2. Cliquez ensuite avec le bouton droit de la souris sur Valider, Ajouter une action personnalisée et choisissez le fichier que vous souhaitez exécuter. (Notez que cela doit déjà être dans votre dossier d’application, ce qui ne devrait pas poser de problème dans votre cas puisque vous exécutez votre programme de toute façon. 
  3. Choisissez simplement la sortie de votre projet.
  4. Ensuite, cliquez sur ce fichier .exe ajouté et définissez InstallerClass sur false. Ceci est crucial car il va chercher un programme d'installation autrement.
  5. Vous pouvez même passer des paramètres à votre fichier .exe en les ajoutant à la propriété Arguments.
84
sbenderli

Dans Visual Studio 2010, ici, c'est facile ...

Étape 1: Ajoutez une nouvelle classe d’installateur au projet d’application que vous souhaitez exécuter après l’installation, appelez-la comme vous voulez.

Étape 2: Ajoutez le code suivant à la classe d’installation que vous venez d’ajouter, en remplaçant MyApplication.exe par le nom de votre nom.

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

Compilez et partez ...

7
Jarrod

Dans mon cas, je me suis battu avec cela pendant un moment et la solution était juste là . La solution fournie en utilisant l'action personnalisée directement sur la sortie principale de l'application n'était pas bonne pour moi, car l'application d'installation reste en place jusqu'à votre départ l'application principale . Ainsi, le problème pourrait être résolu en utilisant l'approche suivante:

  1. Ajoutez une classe d'installation à votre projet.
  2. Dans la nouvelle classe, remplacez la méthode Commit, comme Jarrod a parlé ci-dessus .

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

  3. Maintenant, l'astuce: allez dans le volet "Actions personnalisées" du projet d'installation et ajoutez la sortie principale de votre projet aux dossiers "Valider" et "Installer". Ne changez rien dans les propriétés. Cela fonctionnera comme ça. Par défaut, il obtiendra la classe du programme d'installation où vous avez inséré le code, au point précédent;
  4. Construisez votre paquet d'installation et installez-le. Vous devriez remarquer que l'application va commencer à la fin;
  5. Fermez simplement l'avertissement d'installation réussie et allez-y.

Pour en savoir plus à ce sujet et où je l’ai obtenu, rendez-vous sur this .

PS: je l'ai fait en utilisant VS2017 et Framework 2.0.

4
Artur Gomes

Essayez de consulter cet article de blog: http://blogs.msdn.com/b/astebner/archive/2006/08/12/696833.aspx

Je ne peux pas attester si cela fonctionne pour 2010 ou non; Je suis toujours bloqué sous 2008 jusqu'à ce que mon serveur TFS soit mis à niveau. De plus, j'utilise WiX pour mes installateurs. Mais, c'est juste une action personnalisée, donc je pense que cela devrait toujours être pris en charge.

J'espère que cela t'aides!

(Au fait, pendant que je pratiquais sur Google pour trouver ceci, votre question apparaissait sur la première page de Google pour cette question.)

3
fire.eagle

La solution de https://blogs.msdn.Microsoft.com/astebner/2006/08/12/mailbag-how-can-i-customize-an-msi-in-the-visual-studio-setupdeployment-project/ ajoute une case à la fin de l’installation pour choisir de lancer ou non l’application. Vous pouvez modifier le script pour qu'il soit vérifié par défaut ... ou même le cacher.

Le gros avantage ici est que l'application ne fonctionnera pas avec des droits élevés, comme l'a mentionné Maurice Flanagan.

Le script requis dont vous avez besoin est:

// 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);
}

Editez le fichier pour afficher le nom de votre choix et le nom de l'exécutable, mettez ce fichier à côté de votre projet d'installation .vdproj et dans la post-construction, ajoutez la ligne suivante:

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

0
JayTee

Ajouter une autre réponse car aucune des réponses précédentes ne répond à la question de case à cocher ou de bouton dans le message d'origine.

Vous ajouteriez une des boîtes de dialogue prédéfinies à votre projet de configuration, quelque chose comme CheckBoxes (A) en cliquant avec le bouton droit de la souris sur le bouton Démarrer de la vue Interface utilisateur. Cliquez avec le bouton droit sur la boîte de dialogue après l'ajout pour la déplacer. Vous n'avez besoin que d'une case à cocher pour la question sur l'exécution du programme afin d'éliminer les autres. Le nom de propriété par défaut est CHECKBOXA1, ajoutez donc une condition à l'action personnalisée qui déclenche le code CHECKBOXA1 = 1, ce qui signifie que la vérification a été effectuée. 

0
PhilDW