2010-11-17 23 views
1

Nous avons un msi (créé à l'aide du projet d'installation de Visual Studio) qui enregistre un composant COM. À l'installation tout fonctionne bien et à la fin le registre contient une clé sous HKEY_CLASSES_ROOT pour le composant com faisant référence à la clé de registre CLSID pointant sur la DLL.msi personnalisé supprime les clés de registre nécessaires

Nous avons construit notre msi à travers un environnement CI qui construit une version incrémentée du msi chaque fois que le code change. Si j'essaie d'exécuter une version supérieure de msi sur une machine sur laquelle le produit est déjà installé, la clé de registre du composant com est supprimée. C'est mauvais. Si je réexécute le msi pour réparer l'installation, la clé est ajoutée et tout fonctionne correctement.

Des idées sur ce qui se passe ou comment résoudre ce problème?

Voici quelques pertinents (je l'espère) conservent des informations de la mise à jour:

MSI (s) (20:38) [14:43:42:158]: Executing op: RegOpenKey(,Key=X.Validation.ValidationInitializationLogger,,BinaryType=0,) 
MSI (s) (20:38) [14:43:42:158]: Executing op: RegAddValue(,Value=X.Validation.ValidationInitializationLogger,) 
WriteRegistryValues: Key: \Software\Classes\X.Validation.ValidationInitializationLogger, Name: , Value: X.Validation.ValidationInitializationLogger 
MSI (s) (20:38) [14:43:42:158]: Executing op: RegOpenKey(,Key=CLSID\{0E5EA3AC-6F32-3071-BB20- F99DC060C76E}\ProgId,,BinaryType=0,) 
MSI (s) (20:38) [14:43:42:158]: Executing op:  RegAddValue(,Value=X.Validation.ValidationInitializationLogger,) 
WriteRegistryValues: Key: \Software\Classes\CLSID\{0E5EA3AC-6F32-3071-BB20-F99DC060C76E}\ProgId, Name: , Value: X.Validation.ValidationInitializationLogger 
MSI (s) (20:38) [14:43:42:158]: Executing op: RegOpenKey(,Key=CLSID\{0E5EA3AC-6F32-3071-BB20- F99DC060C76E}\InprocServer32,,BinaryType=0,) 
MSI (s) (20:38) [14:43:42:158]: Executing op: RegAddValue(,Value=mscoree.dll,) 
WriteRegistryValues: Key: \Software\Classes\CLSID\{0E5EA3AC-6F32-3071-BB20- F99DC060C76E}\InprocServer32, Name: , Value: mscoree.dll 
MSI (s) (20:38) [14:43:42:174]: Executing op: RegAddValue(Name=Class,Value=X.Validation.ValidationInitializationLogger,) 
WriteRegistryValues: Key: \Software\Classes\CLSID\{0E5EA3AC-6F32-3071-BB20- F99DC060C76E}\InprocServer32, Name: Class, Value: X.Validation.ValidationInitializationLogger 
... 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegRemoveValue(Name=Class,Value=X.Validation.ValidationInitializationLogger,) 
RemoveRegistryValues: Key: \Software\Classes\CLSID\{A2C211B7-A4B7-34CB-8996- 98287F881E24}\InprocServer32, Name: Class 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegRemoveValue(Name=ThreadingModel,Value=Both,) 
RemoveRegistryValues: Key: \Software\Classes\CLSID\{A2C211B7-A4B7-34CB-8996- 98287F881E24}\InprocServer32, Name: ThreadingModel 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegRemoveValue(Name=CodeBase,Value= [#_18CD862A59400E9C1978B46E816FB049],) 
RemoveRegistryValues: Key: \Software\Classes\CLSID\{A2C211B7-A4B7-34CB-8996-98287F881E24}\InprocServer32, Name: CodeBase 
MSI (s) (20:EC) [14:43:43:924]: Executing op:  RegOpenKey(,Key=X.Validation.ValidationInitializationLogger,,BinaryType=0,) 
MSI (s) (20:EC) [14:43:43:924]: Executing op:  RegRemoveValue(,Value=X.Validation.ValidationInitializationLogger,) 
RemoveRegistryValues: Key: \Software\Classes\X.Validation.ValidationInitializationLogger, Name: 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegOpenKey(,Key=CLSID\{A2C211B7-A4B7-34CB-8996-98287F881E24}\ProgId,,BinaryType=0,) 
MSI (s) (20:EC) [14:43:43:924]: Executing op:  RegRemoveValue(,Value=X.Validation.ValidationInitializationLogger,) 
RemoveRegistryValues: Key: \Software\Classes\CLSID\{A2C211B7-A4B7-34CB-8996-98287F881E24}\ProgId, Name: 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegOpenKey(,Key=CLSID\{A2C211B7-A4B7-34CB-8996-98287F881E24},,BinaryType=0,) 
MSI (s) (20:EC) [14:43:43:924]: Executing op:  RegRemoveValue(,Value=X.Validation.ValidationInitializationLogger,) 
RemoveRegistryValues: Key: \Software\Classes\CLSID\{A2C211B7-A4B7-34CB-8996-98287F881E24}, Name: 
MSI (s) (20:EC) [14:43:43:924]: Executing op:  RegOpenKey(,Key=X.Validation.ValidationInitializationLogger\CLSID,,BinaryType=0,) 
MSI (s) (20:EC) [14:43:43:924]: Executing op: RegRemoveValue(,Value={A2C211B7-A4B7-34CB-8996-98287F881E24},) 
RemoveRegistryValues: Key: \Software\Classes\X.Validation.ValidationInitializationLogger\CLSID,  Name: 

Il semble que les clés de Registre sont ajoutées puis retirées à la fin de la mise à jour.

+0

Tout ce que je peux ajouter pour que les gens puissent mieux répondre? – John

Répondre

0

Je sais que vous dites que le MSI est correctement versionné, qu'en est-il du composant COM? Est-ce que FileVersion (AssemblyFileVersion dans .NET) est également versionné?

+0

Le FileVersion est plus haut - mais quand je regarde le composant COM le RuntimeVersion est inchangé. Edit: Juste réalisé que c'est l'exécution de .net - donc probablement pas le problème. – John

+0

Avez-vous connecté la mise à niveau? –

+0

J'espère que l'extrait que j'ai ajouté en haut aide. – John

0

Si vous essayez de vous mettre à jour devriez probablement essayer d'utiliser

<RemoveExistingProducts After="InstallFinalize" /> 

(en termes Wix).

1

J'ai rencontré le même problème et je viens de terminer mon travail. L'intention de ma mise à niveau MSI est de désinstaller l'ancienne version et de réinstaller la nouvelle version afin que les anciens composants ne soient pas oubliés. Initialement, les entrées de registre étaient supprimées, un peu comme vous le faites. Pour résoudre ce problème, je l'ai fait les modifications suivantes manuellement via Orca.exe:

  • Dans le tableau Properties, j'ai ajouté la paire clé/valeur: REINSTALLMODE = amus
  • Dans le tableau InstallExecuteSequence, j'ai modifié le Sequence du RemoveExistingProducts Action à venir juste avant l'action InstallValidate. C'est sur les conseils d'Adrian Accinelli à partir du fil suivant: MSDN MSI Forum
  • Enfin, j'ai vérifié que les lignes du tableau Upgrade étaient correctes. Je l'ai modifié pour que la ligne avec ActionProperty = PREVIOUSVERSIONSINSTALLED ait la version min définie à 1.0.0.0, la version max définie sur le numéro de version de la version précédente, et les Attributs définis sur 768. J'ai modifié la ligne avec ActionProperty = NEWERPRODUCTFOUND pour que la version min soit définie sur le numéro de version de votre mise à niveau, la version max définie sur vide et les attributs définis sur 258. Voir here pour les détails de la colonne Attributes.

Comme vous le savez probablement, Orca fait partie du Windows SDK. Cependant, tout cela peut être automatisé dans un événement post-construction à l'aide Cscript et WiRunSQL.vbs en utilisant des commandes comme:

Cscript WiRunSQL.vbs foo.msi "INSERT INTO Property (Property.Property, Property.Value) VALUES ('REINSTALLMODE','amus')"

Bonne chance! Faites-moi savoir comment ça se passe! -Ken