2012-01-03 71 views
1

MSI產品代碼考慮以下幾點:找不到在64位Windows

我用VS2010創建一個C#.NET 32位的Windows服務(目標= 86,框架= 4.0)和相應的安裝項目( .msi)程序。

我的研發機器是32位Widnows XP Professional SP3。

我有一個特殊的需求:我必須能夠以編程方式從單獨的32位應用程序卸載我的服務。對於這種情況,卸載應用程序必須知道卸載時要安裝的服務的產品代碼(以便能夠調用「msiexec.exe/uninstall」)。

我已經解決了這個問題,讓32位卸載應用程序通過註冊表搜索安裝的組件,直到遇到與我的服務名稱匹配的那個,然後它獲取相應的產品代碼。這非常簡單,而且工作得很好。

今天我試着在64位Windows 7上安裝我的服務。該服務運行良好,但是當涉及到卸載時,我的32位卸載應用程序無法再在註冊表中找到產品代碼。這是因爲32位卸載程序應用程序只能看到註冊表的重定向(wow6432node)部分,而安裝信息是(由於未知原因)放入原始的無向部分。

我該如何解決這個問題?

  • 我可以強制安裝程序將安裝信息放入註冊表的重定向部分嗎?

  • 我可以訪問並掃描32位卸載程序應用程序中的無向註冊表部分嗎?

  • 我可以 - 在安裝過程中 - 以某種方式檢索產品代碼並將其存儲在另一個位置(可從我的32位卸載程序訪問)?

  • 是否有另一種檢索不涉及搜索註冊表的產品代碼的方法?

+0

另一個想法:我應該創建一個小型的64位應用程序,它可以讓註冊表搜索我並從我的32位卸載程序應用程序啓動它? – 2012-01-03 14:29:41

+0

只有64位軟件包使用64位註冊表配置單元。在Wow6432Node中寫入32位軟件包。您使用的是64位安裝程序嗎? – 2012-01-03 15:47:02

+0

我使用VS2010的標準安裝項目,它的目標是x86(根據頂部的指標)。我不明白爲什麼它會寫入64位配置單元。 – 2012-01-03 16:10:02

回答

0

而是再通過註冊表洞穴探險,你應該使用WiX的DTF的Microsoft.Deployment.WindowsInstaller裝配,使Windows安裝程序API調用來確定你正在尋找的產品代碼。