Question

La réponse implique probablement une action de désinstallation personnalisée, mais elle semble être aussi importante survient et que chaque application voudrait, alors je pensais voir que je ne verrais quelque chose de facile que je manque.

J'ai quelques projets créés dans Visual Studio 2008 à l'aide de projets C #, WinForm. On utilise un clic-une fois installé et une utilisation d'un projet d'installation. Ils vous permettent tous deux de laisser l'application en cours d'exécution lorsque vous désinstallez. Sous Windows 7, vous obtenez un avertissement, mais avez la possibilité de laisser courir quand même ... sur XP, pas même un avertissement.

Appelez-moi fou, mais la pensée de tous mes fichiers de programme étant supprimés et que mon application est toujours laissée en cours d'exécution, ne ressemble pas à un bon design du tout. Les souvenirs de GPFS se viennent à l'esprit, ou la manière dont .NET utilise le chargement de retard pour les DLL, peut également être un problème lorsque la DLL doit être chargée et disparaît.

est donc un moyen facile de ne pas permettre de désinstaller si votre application est toujours en marche?

J'utilise c # mais j'utilise la classe d'instance unique VB.NET pour vous assurer que mon application ne fonctionne qu'une seule fois, alors peut-être quelque chose qui en profitent par opposition à la création d'un mutex pour vérifier?

Aussi mon application permet uniquement d'installer "par utilisateur", non pas "tous les utilisateurs", je ne devrais donc pas avoir à vous soucier de mon application en cours d'exécution dans une autre session (si c'est le cas, il convient de rester en cours d'exécution car elle devrait être 100% sa propre copie).

edit: Depuis que je ne trouve rien d'autre, j'ai essayé l'idée de mutex et ça ne marche pas. Voici mon code:

Dans l'application, j'ai ceci pour créer le mutex nommé et rester en vie pendant l'exécution de l'application:

        System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare");

        SingleInstanceApplication.Run(TabForm, NewInstanceHandler);

        GC.KeepAlive(m);

Dans l'action de désinstallation, j'ai ceci à la boucle jusqu'à ce qu'ils sortent (puisqu'ils ne semblent pas être faciles à fournir une option d'annulation):

            while (true)
            {
                bool createdNew;
                System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare", out createdNew);
                m.ReleaseMutex();
                if (createdNew)
                    break;
                MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
            }

CreateNew n'est jamais défini dans l'action de désinstallation, presque comme il fonctionne sous une session différente ou quelque chose. Je n'ai pas essayé d'ajouter Global \ au nom de Mutex, mais cela ne fonctionnerait pas bien pour mon application, car je fais des installations par utilisateur, une installation devrait donc être capable de continuer à fonctionner sur une autre session même si l'on est désinstallé. < / p>

Était-ce utile?

La solution

Réponse courte est qu'il n'y a pas de moyen facile de le faire car ce n'est pas quelque chose que Microsoft veut que vous fassiez.

Ma réponse a fini par utiliser un mutex, une fois que j'ai eu le code correct, il semble fonctionner correctement.

dans l'application que je fais:

System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m); 

La ligne SialInstanCeApplication.Run est ce qui exécute votre application, j'utilise le cadre VB.NET.

Dans l'action de désinstallation personnalisée, je fais:

while (true)
{
   bool createdNew;
   System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere", out createdNew);
   m.Close();
   if (createdNew)
      break;
   MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
}    

Au début, j'utilisais M.ReleasEmutex () au lieu de M.Close () que j'ai découvert portait une exception parce que je ne possédais pas le mutex.Fermer était ce que j'aurais dû utiliser, juste pour m'assurer que ma copie était fermée avant de vérifier à nouveau (sinon Createenew n'était jamais vrai, si ce n'était pas vrai la première fois).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top