57 votes

Visual Studio Installer > Comment lancer l'application à la fin de l'installation ?

Il s'agit probablement d'une question stupide et mon Google ne fonctionne 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 bouton ou cette case à cocher se trouverait sur la dernière page du paquet d'installation MSI. J'utilise Visual Studio 2010 Ultimate.

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

C'est probablement très simple, mais je n'arrive pas à le comprendre. Merci d'avance pour votre aide.

2 votes

Je recommande d'utiliser la solution de Cheeso. ici .

96voto

sbenderli Points 1390

Avertissement : L'application finira par s'exécuter en tant que compte à privilèges élevés, ce qui a des répercussions sur la sécurité et l'expérience utilisateur.

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

  1. Cliquez avec le bouton droit de la souris sur votre projet d'installation, puis cliquez sur Actions personnalisées.
  2. Ensuite, cliquez avec le bouton droit de la souris sur Commit, Add Custom Action, et choisissez le fichier que vous souhaitez exécuter. (Notez qu'il doit déjà être dans votre dossier d'application, ce qui ne devrait pas être un problème dans votre cas puisque vous exécutez votre programme de toute façon.
  3. Il suffit de choisir la sortie de votre projet.
  4. Ensuite, cliquez sur ce fichier .exe ajouté, et changez InstallerClass en false. C'est crucial car, sinon, il cherchera un programme d'installation.
  5. Vous pouvez même passer des paramètres à votre .exe en les ajoutant à la propriété Arguments.

0 votes

Excellent une question, est-ce que l'application principale serait considérée comme 'sortie primaire de l'applicationName (Active)' ?

45 votes

Un problème. L'application d'installation démarre mon application mais ne se ferme jamais jusqu'à ce que je quitte mon application. Elle reste bloquée sur "98%" et ne se termine que lorsque je quitte mon application. Existe-t-il un moyen d'arrêter l'installateur de manière élégante ? J'ai fait en sorte de mettre InstallerClass sur False. Y a-t-il quelque chose qui m'échappe ?

7 votes

Aah oui cela arrivera...dans mon cas c'était acceptable. ce que vous pouvez faire à la place est d'exécuter un script à partir de votre installateur qui à son tour exécutera votre application et sortira. de cette façon, votre application fonctionnera, mais le script sortira ce qui laissera votre installateur se terminer également.

18voto

JayTee Points 328

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 à cocher à la fin de l'installation pour choisir si vous voulez lancer l'application ou non. Vous pouvez modifier le script pour qu'il soit coché par défaut...ou même le cacher.

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

Le script requis est le suivant :

// 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 + "', 'Line1', '|')";
    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);
}

Modifiez le fichier pour indiquer votre nom souhaité et le nom de l'exécutable, mettez ce fichier à côté de votre projet .vdproj Setup et dans le postbuild ajoutez la ligne suivante :

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

7voto

Jarrod Points 31

Avertissement : L'application finira par s'exécuter en tant que compte à privilèges élevés. ce qui a des conséquences sur la sécurité et l'expérience utilisateur.

Dans Visual Studio 2010, il est facile...

Étape 1 : Ajoutez une nouvelle classe d'installation 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 Installer que vous venez d'ajouter en remplaçant MonApplication.exe par le nom de votre choix.

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...

0 votes

Après avoir terminé l'installation de l'installation MSI du formulaire de fenêtre, mes fichiers bruts (conception et codage) apparaissent également à l'emplacement d'installation. J'ai développé cette application en utilisant Visual Studio 2010. L'installation a été créée avec succès, mais après l'installation de ce MSI, ce problème se produit. Veuillez m'aider. Merci d'avance.

2 votes

L'utilisation de cette méthode lancera le nouveau programme avec des privilèges d'administrateur, ce qui est probablement indésirable pour la sécurité.

5voto

Artur Gomes Points 84

Dans mon cas, je me suis battu avec cela pendant un certain temps et la solution était juste là. La solution fournie en utilisant l'action personnalisée directement à la sortie primaire de l'application n'était pas bonne pour moi, puisque l'application d'installation reste jusqu'à ce que vous quittiez l'application principale. Donc, 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, surchargez la méthode Commit, comme Jarrod l'a dit. au-dessus de .

    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 Installer et ajoutez la sortie principale de votre projet aux dossiers "Commit" et "Install". Ne changez rien dans les propriétés. Cela fonctionnera comme ça. Par défaut, il obtiendra la classe d'installation où vous avez inséré le code, au point précédent ;

  4. Créez votre paquet d'installation et installez-le. Vous devriez remarquer que l'application démarrera à la fin ;

  5. Fermez simplement l'avertissement d'installation réussie et allez-y.

Pour en savoir plus à ce sujet et savoir où je l'ai obtenu, veuillez consulter le site suivant ce .

PS : Je l'ai réalisé en utilisant VS2017 et Framework 2.0.

3voto

fire.eagle Points 1278

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

Je ne peux pas dire si cela fonctionne pour 2010 ou non ; je suis toujours coincé avec 2008 jusqu'à ce que mon serveur TFS soit mis à jour. J'utilise également WiX pour mes installateurs. Mais, c'est juste une action personnalisée, donc je pense qu'elle devrait toujours être supportée.

J'espère que cela vous aidera !

(Au fait, pendant que je m'entraînais à faire des recherches sur Google pour trouver ceci, votre question apparaissait sur la première page de Google pour cette question).

0 votes

Heh. Je n'ai pas eu droit à la fenêtre contextuelle "Quelqu'un d'autre a répondu" en haut de la page. Je suggère d'utiliser la solution de sbenderli. C'est beaucoup plus simple que l'article du blog.

0 votes

Merci ! J'envisage de me tourner vers WiX car j'ai lu de bonnes choses à son sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X