web-dev-qa-db-fra.com

Dans un projet d'installation de Visual Studio, comment générer un script de désinstallation?

J'ai un projet d'installation de Visual Studio. Lors de l’installation, il crée un fichier batch de désinstallation dans le dossier de l’application. SI l'utilisateur veut désinstaller le produit, il peut aller dans "Ajout/Suppression de programmes" ou double-cliquer sur le fichier uninstall.cmd. Le contenu est: 

%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285}

Le GUID contient le code de produit du projet d'installation dans Visual Studio. 

ProductCode

Toutefois, pour que les mises à niveau fonctionnent correctement, je dois incrémenter le numéro de version à chaque fois que je produis un nouveau MSI. Et, si j'incrémente le numéro de version, je dois également générer un nouveau Guid pour le ProductCode. Ce qui signifie que le fichier statique uninstall.cmd doit être modifié. 

Comment générer dynamiquement un fichier de commandes contenant le ProductCode pour, au moment de la construction? 

27
Cheeso

Ceci est le script que j'ai écrit qui crée un uninstall.cmd. Il s'exécute comme une action personnalisée lors de l'installation. 

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "uninstall.cmd", ForWriting, true);

ts.WriteLine("@echo off");
ts.WriteLine("goto START");
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(" Uninstall.cmd");
ts.WriteBlankLines(1);
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(":START");
ts.WriteLine("@REM The uuid is the 'ProductCode' in the Visual Studio setup project");
ts.WriteLine("%windir%\\system32\\msiexec /x " + productCode);
ts.WriteBlankLines(1);
ts.Close();

Le résultat est un fichier cmd contenant toujours le code de produit actuel. 

L'inconvénient est que? Le script qui crée le fichier uninstall.cmd reste dans le répertoire d'installation. Ce n'est pas un gros problème, mais je n'aime pas les ordures du répertoire d'installation. Je n'ai pas encore essayé de supprimer automatiquement "createInstaller.js". Cela pourrait fonctionner. 

EDIT: oui, la suppression automatique de createInstaller.js fonctionne correctement. 

Je vais accepter ma propre réponse! 

3
Cheeso

J'ai trouvé cette solution ici

"À l'aide de Visual Studio 2005/2008, vous n'avez pas besoin d'écrire de code pour ajouter une option de désinstallation pour un projet d'installation (oui, je sais que certaines personnes peuvent écrire du code pour le faire.)

1) Dans les fenêtres Projet de configuration -> Système de fichiers -> Cliquez avec le bouton droit de la souris sur «Système de fichiers sur la machine cible» -> ajouter un dossier spécial, sélectionnez Dossier système;

2) Dans ce dossier système Ajouter un fichier. Recherchez msiexec.exe à partir du dossier System32 local et ajoutez-le. Remplacez les propriétés par défaut de ce fichier comme suit:

Condition: = Non installé (assurez-vous de mettre 'Non installé' exactement comme cela, même cas et tout), Permanent: = True, Système: = True, Transitive: = True, Vital: = False.

3) Créez un nouveau raccourci dans le menu "Programme d’utilisateur", définissez Target sur le dossier système que vous avez créé à l’étape 1 et dirigez-le sur le fichier msiexec.exe. Renommez le raccourci pour «Désinstaller votre application». Définissez la propriété Arguments sur/x {space} [ProductCode].

4) Construisez le projet, ignorez l'avertissement sur le fait que msiexec doit être exclu, ne l'excluez PAS ou le projet d'installation ne se construira pas.

La condition 'Non installé' et Permananet: = True garantissent que le fichier msiexec.exe est uniquement placé dans le dossier système dans le cadre de l'installation SI il n'existe pas déjà et qu'il n'est pas supprimé lors d'une désinstallation - par conséquent, il assez sûr d'ignorer cet avertissement et d'y aller.

(Basé sur la description de SlapHead) "

65
Ben

Je viens de faire this work:

Ajoutez un fichier uninstall.bat à votre projet. Le contenu du fichier est:

msiexec.exe /x %1

Créez un raccourci vers ce fichier de commandes (par exemple, dans le menu Programme de l'utilisateur), indiquez-le dans les propriétés du raccourci, à côté de Arguments: [ProductCode].

11
MPelletier

une légère variation de l'approche du fichier batch. Si vous ne souhaitez pas afficher une fenêtre de commande, utilisez un fichier wscript. fournissez [ProductCode] comme auparavant dans Arguments

<job>
<?job debug="true" error="true" ?>
<script language="JScript">
    var arg = [];
    for (var i=0; i<WSH.Arguments.length; i++) {
        arg.Push( WSH.Arguments.Item(i) );
    }

    if (arg.length>0) {
        var productcode = arg[0];
        var v = new ActiveXObject("Shell.Application");
        v.ShellExecute("msiexec.exe", "/x "+productcode, "", "open", 10);
    }

    WSH.Quit(0);
</script>
</job>
2
locksmith

J'ai fait une combinaison de la réponse acceptée et de la réponse de Locksmith pour ne voir aucun clignotement d'invite de commande ou l'invite de commande elle-même. Un pro de le faire comme ceci est que vous n'avez pas à créer un raccourci et à définir les arguments pour qu'il fonctionne.

Mon fichier createUninstaller.js:

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "Uninstall.js", ForWriting, true);

ts.WriteLine("var v = new ActiveXObject(\"Shell.Application\");");
ts.WriteLine("v.ShellExecute(\"msiexec.exe\", \"/x "+productCode+"\", \"\", \"open\",10);");
ts.Close();

Ce fichier est ajouté en tant qu'action personnalisée au niveau de l'action de validation 'répertoire'. Pour obtenir ces actions personnalisées: Cliquez avec le bouton droit de la souris sur votre projet de configuration> Afficher> Actions personnalisées> Faites un clic droit sur valider 'répertoire'> ajouter une action personnalisée. Une fois que vous devez rechercher le fichier createUninstaller.js que vous avez créé et l’ajouter.

Maintenant, pour que createUninstaller.js lise les variables targetDir et productCode, vous devez
Cliquez avec le bouton droit de la souris sur le fichier createUninstaller.js dans l'action personnalisée du projet d'installation 'Commit' et accédez à la fenêtre des propriétés . Dans les propriétés, vous verrez la propriété 'CustomActionData'. Ici, il vous suffit de copier coller [TARGETDIR] | [ProductCode]
Et VOILA! Il convient maintenant d’ajouter le fichier Uninstall.js qui fonctionnera dès que vous double-cliquez dessus.

1
Merv

Je me rends compte que cette question a déjà reçu une réponse, mais ce que j'ai fait est de créer un fichier batch avec le contenu suivant:

start msiexec.exe /x %1

L'utilisation de "start" empêche la commande Invite de rester ouverte pendant le processus de désinstallation et le% 1 est remplacé par le premier argument que vous transmettez au fichier de commandes lors de son exécution.

J'ai ajouté le fichier de commandes au dossier de l'application et créé un raccourci de menu qui pointe vers le fichier de commandes. Si vous cliquez avec le bouton droit sur le raccourci et sélectionnez Fenêtre Propriétés. Dans ce document, ajoutez le texte suivant à la propriété Arguments:

[ProductCode]

Après avoir créé et exécuté le programme d'installation, vous disposez d'un raccourci du menu Démarrer qui appelle le fichier de commandes et transmet le code produit tel qu'il était lors de la construction de cette version de l'application. L'utilisateur verra alors une invite demandant si le produit doit être désinstallé.

Le seul inconvénient de cette solution est que si l'utilisateur accède au dossier de l'application et double-clique sur le fichier de commandes, le programme de désinstallation génère une erreur indiquant que le package d'installation n'existe pas.

1
Jela

Pour supprimer l'application, j'utiliserais le [ProductCode] en tant que paramètre, appelant le msiexec depuis l'application elle-même. Pour un guide détaillé sur la création du programme de désinstallation, veuillez consulter le blog suivant: http://endofstream.com/creating- uninstaller-in-a-visual-studio-project/

1
Peter

chaque fois que vous générez une configuration, changez toujours le code du produit. Créez un raccourci pour le programme de désinstallation et vous y trouverez la technique de transmission des arguments en ligne de commande pour trier coupé. là vous écrirez toujours "/ u code produit" code produit vous devez écrire ici toujours.

mettre ce code dans la méthode principale du fichier program.cs

[STAThread]
        static void Main()
        {
            bool flag = true;
            string[] arguements = Environment.GetCommandLineArgs();
            foreach (string str in arguements)
            {
                if ((str.Split('='))[0].ToLower() == "/u")
                {
                    if (MessageBox.Show("Do you want to uninstall job board", "Are you Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        flag = false;
                        RemoveRegSettings();
                        RemoveIniFile();
                        string guid = str.Split('=')[1];
                        string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
                        ProcessStartInfo si = new ProcessStartInfo(path + @"\msiexec.exe", "/i" + guid);
                        Process.Start(si);
                        Application.Exit();
                        return;
                    }
                }
            }
            //

            //************************************************
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
0
Thomas