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.
Pour exécuter n'importe quelle application une fois l'installation terminée,
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 ...
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:
System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(this.Context.Parameters["AssemblyPath"]) + @"\MyApplication.exe")
;
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.
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.)
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)"
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.