2010-11-17 28 views
1

我們有一個註冊COM組件的msi(通過Visual Studio安裝項目創建)。在安裝一切工作正常,並在最後註冊表包含一個鍵HKEY_CLASSES_ROOT下的COM組件引用指向DLL的CLSID註冊表項。自定義msi刪除必要的註冊表項

我們通過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

我可以添加什麼以便人們能夠更好地迴應? – John 2010-11-19 20:46:27

回答

0

我知道你說MSI是正確的版本,COM組件呢?它是FileVersion(.NET中的AssemblyFileVersion)還是更高的版本?

+0

FileVersion更高 - 但是當我查看COM組件時,RuntimeVersion保持不變。編輯:剛纔意識到.net運行時 - 可能不是問題。 – John 2010-11-18 06:09:32

+0

你記錄了升級? – 2010-11-18 13:05:12

+0

希望我在頂部添加的片段有所幫助。 – John 2010-11-18 14:25:00

0

如果你想升級你應該嘗試使用

<RemoveExistingProducts After="InstallFinalize" /> 

(在維克斯計算)。

1

我遇到了同樣的問題,我剛剛完成了它的工作。我升級MSI的意圖是卸載舊版本並重新安裝新版本,以便舊組件不會落後。最初,註冊表項被刪除,就像您遇到的情況一樣。爲了解決這個問題,我已經經由Orca.exe的手動完成下列的變化:

  • Properties表,我已經添加了鍵/值對:REINSTALLMODE = amus
  • InstallExecuteSequence表,我修改了SequenceRemoveExistingProducts行動剛剛出現在InstallValidate行動之前。這是根據阿德里安Accinelli從以下線程的建議:MSDN MSI Forum
  • 最後,我檢查,以確保Upgrade表中的行是正確的。我對它進行了修改,以使ActionProperty = PREVIOUSVERSIONSINSTALLED的版本號將版本最小設置爲1.0.0.0,版本最大值設置爲以前版本的版本號,並將屬性設置爲768.我修改了ActionProperty = NEWERPRODUCTFOUND的行,將版本min設置爲升級版本號,版本最大值設置爲空白,屬性設置爲258.有關Attributes列的詳細信息,請參見here

正如你可能知道的,Orca是Windows SDK的一部分。然而,這一切都可以在生成後事件通過使用Cscript命令,並使用如下的命令WiRunSQL.vbs自動化:

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

祝你好運!讓我知道事情的後續! -Ken