2015-10-13 72 views
0

我已經寫了一個WPF應用程序和一個附帶的Windows安裝項目。該應用程序具有「啓動時運行」的選項,此時將一個密鑰添加到SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run註冊表中。安裝項目默認情況下不會創建該密鑰,因爲該選項默認爲禁用;但是,我想確保是否有人卸載該應用程序的註冊表項將被刪除。如何在Windows安裝項目中清理'啓動時運行'註冊表項?

這可能嗎?另外,如果密鑰未被刪除,行爲是什麼?我假定Windows會嘗試運行該應用程序,但什麼都不會發生,但我還沒有測試這種情況。

編輯 - 按照要求,該註冊表項從代碼設置如下:

using (var key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true)) 
{ 
    if (key != null) 
    { 
    key.SetValue("MyApp", "\"" + System.Reflection.Assembly.GetExecutingAssembly().Location + "\""); 
    } 
} 

因爲默認情況下,我不希望該應用在啓動時運行它做這種方式;因此,在用戶選擇使用該設置之前,不應創建註冊表項。

回答

1

如果您使用安裝自定義操作創建了該密鑰數據,則需要創建一個卸載自定義操作以將其刪除。嚴格地說,如果安裝失敗並回滾,您還應該包含回滾自定義操作以將其刪除。

MSI文件是對系統進行更改的數據庫 - 這就是爲什麼可以卸載其中的任何內容,但它不會跟蹤您對代碼所做的更改。

我很想在應用程序配置的某個地方做這個選項,而不是安裝,所以應用程序可以有一個選項「登錄時開始」,用戶可以打開和關閉。目前,任何想要更改該設置的人都必須擺弄註冊表或重新安裝應用程序,具體取決於他們可能對此有多聰明。

使用其他安裝工具可以獲得更多選擇。例如,Visual Studio不會執行多個功能。使用另一種工具(如WiX),您可以創建一個功能,以便用戶檢查是否需要啓動,並且該功能包含使用Windows Installer註冊表項而不是代碼創建註冊表項的組件。除了沒有編碼之外,該條目在卸載時被刪除;用戶可以隨時進入維護模式並卸載(或添加)該功能;安裝失敗將自動清理它。這只是提供功能的一種方式。

Visual Studio安裝相對容易使用,因爲它們只公開了有限的Windows Installer功能集,因此您可以獲得一些簡單性,但如果您想要超越VS安裝程序提供的功能,則需要付費。但是您也更深入地參與Windows Installer。

+0

所以我想答案是,這是不可能在我的情況下,因爲你的第三款正是我在我的應用程序中做的。我測試瞭如果將該選項設置爲true,然後卸載並重新啓動,會發生什麼情況。即使應用程序不再存在,鍵仍留在註冊表中時沒有可見的警告/錯誤;然而,我感到內疚可能會在用戶的系統上留下無用的註冊表鍵,他們必須手動清理。 – Paul

相關問題