Tuer Windows avec force dans WIX

J’ai un service Windows qui sera installé dans le cadre de l’installation de Wix. Le problème est que, actuellement, le service est en production et qu’il ne répond pas à l’arrêt en raison d’un code mal écrit dans la méthode service OnStop.

Ainsi, la prochaine fois que l’utilisateur tentera d’installer la version mise à niveau, l’installation échouera car le service ne s’arrêtera jamais lorsque wix tentera de l’arrêter.

Existe-t-il un moyen par lequel je parviens à savoir si Wix prend trop de temps pour se désinstaller et que je peux tuer le processus si je reçois cette notification?

Aussi, y a-t-il un moyen de tuer le processus en fonction de la version du produit?

Merci

Je ne devrais pas répondre à cette question car cela fait des années que je n’ai pas eu affaire à ce genre de choses, mais bon sang, essayons.

  1. CloseApplication Element : Peut-être que je voudrais juste essayer d’abord le CloseApplication Element de WiX . Je doute que cela fonctionne pour un service, mais c’est l’approche la plus commode à laquelle je peux penser spontanément.
  2. Sysinternals PsKill : Le PsKill de Mark Russinovich mériterait d’ être essayé. Je pense que ses outils sont redissortingbuables afin que vous puissiez les inclure dans votre configuration, et ils sont toujours bons. Vous devez l’invoquer à partir d’une action personnalisée en mode différé et élevé, ce qui est toujours plus complexe que l’utilisation d’une construction WiX intégrée.
  3. Taskkill : Il y a aussi le Taskkill intégré – que je n’ai jamais utilisé. Utilisation suggérée avec l’outil sc .

Je tiens à souligner que je n’ai pas réellement testé ces outils pour tuer des services et que je n’ai pas le temps de le faire pour le moment. Il pourrait y avoir des problèmes avec le séquençage dans lequel StopServices pourrait être planifié avant l’ CloseApplication programmée de l’action personnalisée CloseApplication de WiX. Veuillez vérifier la InstallExecuteSequence utilisant Orca (vers le bas) après la compilation pour voir si c’est le cas.

J’ai trouvé une solution pour cela après avoir creusé pendant un certain temps.

Je crée un nouveau projet d’action personnalisé C # et je séquence mon action avant InstallInitialize.

Dans ma méthode d’action personnalisée C #, je lis la version de fichier installée existante à l’aide de FileVersionInfo.GetVersionInfo (filePath);

Ensuite, je vérifie avec la version souhaitée que je veux vérifier et si la condition correspond, je tue mon processus de service en utilisant

  foreach (Process proc in Process.GetProcessesByName("ProcessName")) { proc.Kill(); session.Log("Service Killed"); } 

pour ce faire, Wix Toolset v3.11.1 doit être préalablement installé