我们有一个注册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:
似乎正在添加注册表项,然后在更新结束时将其删除。
答案 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
答案 1 :(得分:0)
我知道你说MSI版本正确,COM组件怎么样?它的FileVersion(.NET中的AssemblyFileVersion)是否也更高版本?
答案 2 :(得分:0)
如果您尝试升级,则可能尝试使用
<RemoveExistingProducts After="InstallFinalize" />
(以Wix术语表示)。