Custom msi удаляет необходимые ключи реестра - PullRequest
1 голос
/ 17 ноября 2010

У нас есть MSI (созданный с помощью проекта установки Visual Studio), который регистрирует COM-компонент. При установке все работает нормально, и в конце реестр содержит ключ в разделе HKEY_CLASSES_ROOT для компонента com, ссылающийся на ключ реестра CLSID, указывающий на dll.

У нас есть MSI, созданная в среде CI, которая создает измененную версию MSI при изменении кода. Если я пытаюсь запустить MSI-версию с более высокой версией на компьютере, на котором уже установлен продукт, ключ реестра com-компонента удаляется. Это плохо. Если после этого я снова запускаю msi для восстановления установки, ключ добавляется обратно, и все снова работает нормально.

Есть идеи, что происходит или как это исправить?

Вот некоторая соответствующая (я надеюсь) информация журнала из обновления:

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: 

Похоже, что ключи реестра добавляются, а затем удаляются в конце обновления.

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Я столкнулся с той же проблемой, и я только что закончил прорабатывать ее.Цель моего обновления MSI - удалить старую версию и переустановить новую версию, чтобы старые компоненты не остались позади.Первоначально, записи реестра удалялись, так же, как вы испытываете.Чтобы исправить это, я сделал следующие изменения вручную через Orca.exe:

  • В таблицу Properties я добавил пару ключ / значение: REINSTALLMODE = amus
  • В таблице InstallExecuteSequence я изменил Sequence действия RemoveExistingProducts, чтобы он выполнялся непосредственно перед действием InstallValidate.Это по совету Адриана Акчинелли из следующей ветки: MSDN MSI Forum
  • Наконец, я проверил правильность строк в таблице Upgrade.Я изменил его так, чтобы в строке с ActionProperty = PREVIOUSVERSIONSINSTALLED была установлена ​​минимальная версия 1.0.0.0, максимальная версия - номер версии предыдущей версии, а атрибуты - 768. Я изменил строку с ActionProperty = NEWERPRODUCTFOUND, чтобыВ качестве минимальной версии указывается номер версии вашего обновления, максимальная версия - пустое, а атрибуты - 258. Подробную информацию о столбце Attributes см. здесь .вы, наверное, знаете, Orca является частью Windows SDK.Однако все это можно автоматизировать в событии после сборки, используя Cscript и WiRunSQL.vbs, используя команды, подобные следующим:

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

    Удачи!Дайте мне знать, как это происходит!* Кен 1030 *

0 голосов
/ 27 ноября 2010

Если вы пытаетесь обновить, вы, вероятно, должны попытаться использовать

<RemoveExistingProducts After="InstallFinalize" /> 

(в терминах Wix).

0 голосов
/ 17 ноября 2010

Я знаю, что вы говорите, что MSI правильно настроен, а как насчет COM-компонента?Является ли FileVersion (AssemblyFileVersion в .NET) более высокой версией?

...