自定义msi删除必要的注册表项

时间:2010-11-17 20:12:11

标签: installer windows-installer registry

我们有一个注册COM组件的msi(通过Visual Studio安装项目创建)。在安装时一切正常,最后注册表在HKEY_CLASSES_ROOT下包含一个键,用于引用指向dll的CLSID注册表项的com组件。

我们通过CI环境构建了msi,每当代码更改时,都会构建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 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我刚刚完成了它。升级MSI的目的是卸载旧版本并重新安装新版本,以便不遗留旧组件。最初,注册表项被删除,就像您遇到的那样。为了解决这个问题,我通过Orca.exe手动完成了以下更改:

  • Properties表中,我添加了键/值对:REINSTALLMODE = amus
  • InstallExecuteSequence表格中,我修改了Sequence动作的RemoveExistingProducts,紧接InstallValidate动作之前。这符合Adrian Accinelli的建议,来自以下主题:MSDN MSI Forum
  • 最后,我检查了以确保Upgrade表中的行是正确的。我对其进行了修改,以便ActionProperty = PREVIOUSVERSIONSINSTALLED行的版本min设置为1.0.0.0,版本max设置为以前版本的版本号,属性设置为768.我用{{1}修改了行将版本最小值设置为升级版本号,版本最大值设置为空白,属性设置为258.有关ActionProperty = NEWERPRODUCTFOUND列的详细信息,请参阅here

您可能知道,Orca是Windows SDK的一部分。但是,所有这些都可以通过使用Cscript和WiRunSQL.vbs使用如下命令在后期构建事件中自动执行:

Attributes

祝你好运!让我知道事情的后续! -Ken

答案 1 :(得分:0)

我知道你说MSI版本正确,COM组件怎么样?它的FileVersion(.NET中的AssemblyFileVersion)是否也更高版本?

答案 2 :(得分:0)

如果您尝试升级,则可能尝试使用

<RemoveExistingProducts After="InstallFinalize" /> 

(以Wix术语表示)。