2010-09-29 5 views
2

J'ai un programme qui génère un autre processus à partir de l'un des assemblys chargés. Ce deuxième processus va et attrape un programme d'installation pour le programme qui l'a engendré (encore confus?). Ce second processus commence juste le programme d'installation à une adresse Web spécifique:Comment démarrer un processus en C#, mais l'exécuter seulement après que tous les assemblys ont été déchargés?

System.Diagnostics.Process.Start(www.mySite.com/myInstaller.exe); 

Le problème est que si ce programme d'installation est exécuté avant les assemblées du programme mère ont été déchargées, il ne sera pas installé correctement comme deux assemblées du programme doivent être être écrasé dans le cadre de l'installation.

Nous avons besoin que ce processus soit appelé depuis notre programme parent.

Ma question est de savoir comment générer ce processus pour qu'il ne s'exécute qu'après le déchargement des assemblages? Y a-t-il une meilleure façon de faire tout cela?

+0

Mise à jour de la question pour préciser Je fais. –

Répondre

2

Donc, fondamentalement, vous avez une application qui « auto-updates ». Votre application principale appelle un programme de mise à jour, qui va chercher l'installateur et l'exécute. Le programme d'installation s'exécute alors, et pourrait facilement remplacer l'ensemble qui a appelé le programme de mise à jour, et le programme de mise à jour. Lorsque l'installation est terminée, vous redémarrez l'application.

Vous pouvez (et .NET le fait par défaut) utiliser le shell du système d'exploitation pour démarrer le nouveau processus. Ce processus n'aura aucun lien avec son parent. Si, par exemple, vous créiez un exécutable dont le seul but était d'ouvrir le Bloc-notes, votre exécutable appelait Process.Start ("notepad.exe"), le Bloc-notes s'ouvrait et votre processus se fermait, laissant le Bloc-notes ouvert. Pour vous assurer que votre application est fermée, vous pouvez utiliser Process.GetProcesses() dans le programme d'installation, qui obtiendra la liste des processus que vous verriez en utilisant le Gestionnaire des tâches. Analysez la liste du nom de l'exécutable de votre application (et le cas échéant, le programme de mise à jour). s'il existe, essayez de dormir pendant une seconde, puis réessayez. Toujours là? Alerter l'utilisateur pour fermer manuellement l'application, puis quand ils disent qu'ils ont, vérifiez à nouveau.

3

Vérifiez dans le processus fils si le processus parent s'est terminé.

En supposant que vous connaissez le nom de votre application ce serait une simple vérification:

Process[] processes = Process.GetProcessesByName("calc"); 
Array.ForEach(processes, p => p.WaitForExit()); 
0

Si votre programme d'installation est «bête», faites une autre application uniquement pour lancer l'installateur une fois que le programme principal est complètement terminé. Bien que cela ait été dit, j'ai une mise à jour automatique dans beaucoup de mes logiciels et je n'ai jamais eu ce problème.

0

Mutex est une classe conçue pour la synchronisation entre processus. Il crée essentiellement un verrou nommé sur tous les processus en cours d'exécution. La vérification des processus en cours par nom semble un peu sale (que se passe-t-il si quelqu'un renomme votre application).

Exemple d'utilisation:

static void Main(string[] args) { 
    bool wasNewMutexCreated; 
    using (var mutext = new Mutex(false, "MyMutext", out wasNewMutexCreated)) { 
    if (!wasNewMutexCreated) { 
     Console.Out.WriteLine("Can't continue - MyMutex is in use."); 
    } 
    // rest of your application logic 
    Console.In.ReadLine(); 
    } 
} 

Tant que votre demande et votre installateur utilisent que, vous devriez être bien. (Si vous voulez autoriser plusieurs instances de votre application, ne faites pas la commande "Impossible de continuer - MyMutex est utilisé dans votre application, uniquement dans votre programme d'installation.)

Questions connexes