Désinstallation d'un assembly partagé en cours d'utilisation laissant WinSxs en mauvais état

StackOverflow https://stackoverflow.com/questions/1425411

  •  07-07-2019
  •  | 
  •  

Question

Je rencontre des problèmes pour désinstaller un assemblage partagé Win32 SxS à l'aide de Wix3 sur Windows XP. Mon fichier Wix ressemble beaucoup à celui décrit dans http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.html .

Le problème est que, si un module de l'assembly est utilisé, le programme de désinstallation se termine avec un code d'erreur de succès mais laisse l'assembly dans un état cassé: le manifeste et le catalogue de sécurité ont été supprimés, mais le répertoire d'assembly existe toujours avec mon dll dedans. Les DLL survivent au redémarrage, elles ne sont donc pas marquées pour la suppression. Le fichier journal MSI ne contient aucune erreur évidente.

Si j'essaie de réinstaller le package, il ignore l'installation de l'assembly. Les composants ne sont plus enregistrés, je ne peux donc pas demander au programme d'installation d'essayer de désinstaller à nouveau. Les informations suivantes apparaissent dans le journal msi lors des installations suivantes:

  

MSI (c) (98:44) [11: 46: 56: 263]: suppression de l'installation du composant d'assemblage: {26A273E7-7F9A-4F77-9FA8-5E413A155BEC}, car l'assemblage existe déjà

Je ne trouve pas le moyen de remettre SxS dans un état satisfaisant, à moins de supprimer manuellement le répertoire de mon assemblage, qui n'est plus protégé par XP System Restore.

Bien que mon programme d’installation actuel soit beaucoup plus compliqué, j’ai été capable de le reproduire avec un programme d’installation très basique doté d’une seule fonctionnalité contenant un seul composant. Ce composant contient une dll, un manifeste et un catalogue de sécurité. Les dlls & Lt; Fichier & Gt; L'élément possède les attributs KeyPath, Assembly et AssemblyManifest. Une fois installé, je peux simuler un processus de chargement de l’ensemble en ouvrant la DLL dans MSVS.

Existe-t-il une action supplémentaire que je devrais invoquer lors de la désinstallation pour détecter et éviter cette situation? Sinon, y a-t-il un moyen de forcer l'opération d'installation à être effectuée même si les DLL existent déjà dans WinSXS?

En quelque sorte, j'ai un problème si j'essaie de mettre à niveau le package qui a installé l'assembly si celui-ci ne change pas. Le programme d’installation décide qu’il n’est pas nécessaire de réinstaller l’assemblage (car il n’a pas changé), mais lorsque SxsUninstallCA est exécuté, il supprime l’assemblage. Du point de vue de l'installateur, le composant est toujours installé mais les fichiers ont disparu.

Était-ce utile?

La solution

Je travaille sur quelque chose qui, je crois, va rencontrer ce même problème.

Mon hypothèse à ce stade est que je & # 8217; je dois résoudre ce problème avec un peu de mojo à partir de la HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations clé d’enregistrement, et éventuellement avec un peu d’autorisation de fichier (si les fichiers étaient toujours verrouillés).

Ce qui nécessite bien sûr un redémarrage.

Bien sûr, dans votre programme d'installation, vous pouvez vérifier la présence des clés et bloquer l'installation jusqu'à leur disparition. (c.-à-d. & "; vous devez redémarrer &";).

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