2009-07-24 49 views
2

如何從C#自定義動作中安裝後提示重新啓動計算機?強制從C#中的Msi自定義動作重新啓動

我們使用VS 2005的安裝項目爲我們的設置,我們需要以編程方式決定提示重新啓動(所以它不會發生在每一個安裝,只是一些)。

更新:我們正在尋找一些已經內置到MSI自定義操作系統中的東西。如果不存在,我們可以自己重新啓動電腦,但想避免這種情況。

更新:我們看到你可以在哪裏設置REBOOT =強制編輯在Orca中的Msi,你可以在運行時從C#自定義動作修改這些表嗎?我們可以將其設置爲每次重新啓動,但這可能會使我們的設置很煩人(它只需要在極少數情況下重新啓動)。

UPDATE:我們嘗試設置:

savedState["REBOOT"] = "Force"; 

從我們的自定義操作的安裝()方法中,但沒有運氣。它似乎不像IDictionary,savedState真的做任何事情。

也試過:

Context.Parameters["REBOOT"] = "Force"; 

但我認爲這個集合是剛剛通過的自定義操作命令行參數。

更新:有沒有辦法用Orca編輯我們的MSI來使這個技巧奏效?也許安排在某些文件存在的情況下重新啓動?我們還沒有找到如何從C#自定義操作中設置MSI屬性。

更新:我們試圖鉤住AppDomain.ProcessExit和AppDomain.DomainUnload並啓動一個新的線程,並調用Process.GetCurrentProcess()WaitForExit(),沒有這些事件將觸發從C#自定義操作中...

回答

1

,因爲它似乎,爲我們解決這個問題的唯一辦法是,要麼:

A)修改MSI與逆戟鯨製作安裝重啓,每安裝

B)重做安裝項目與WiX或Install Shield

感謝您的幫助。

0

當我不得不這樣做之前,我們使用了user32.dll中一個Win32 API函數,我覺得這是它:ExitWindowsEx()

+0

我們需要內置於MSI自定義操作系統中的東西。 我們總是可以用shutdown.exe(或你的Win32函數)以編程方式重啓PC,但是由於MSI需要首先正確完成,所以尋找更好的解決方案。 – jonathanpeppers 2009-07-24 15:22:49

+0

我們有一個C++自定義動作庫,如果需要的話可以重新啓動,現在我想到了它,它可能會設置MSI REBOOT標誌而不是直接調用Win32函數。它已經有一段時間了,所以我不確定...... C++自定義操作不會太難寫,所以我不會排除它。 – Sneal 2009-07-24 19:15:16

+0

瞭解如何從託管自定義操作設置MSI標誌?我想這可能是不可能的... – jonathanpeppers 2009-07-24 20:53:11

2

您需要添加或致電MSI自定義操作ScheduleReboot http://msdn.microsoft.com/en-us/library/aa371527(VS.85).aspx在InstallExecuteSequence, 。您可以通過在自定義操作中使用MSI功能MsiDoAction,http://msdn.microsoft.com/en-us/library/aa370090(VS.85).aspx來完成此操作。請注意,安排此操作的自定義操作必須是立即自定義操作,而不是延遲自定義操作。這意味着您可能需要在InstallFinalize之後安排它。您還可以將它添加到InstallExecuteSequence中,並在您的自定義操作設置的公共屬性上添加一個條件。

0

LanceSc給了你答案。您需要運行ScheduleReboot,最好的方法是將其插入您在自定義操作中設置的自定義屬性的InstallExecuteSequence中。

正如你所說,Wix是未來靈活性的方法。 Wix現在還包括DTF(部署工具基礎),它是一組包含整個Windows API的.NET類庫。您可以使用它來輕鬆訪問C#中的MSI數據庫或編寫C#自定義操作。如果需要,我可以提供更多信息。