我正在使用c#,.net 4,WIX 3.5,Windows Vista。 我通過p/invoker RegisterApplicationRestart方法和處理WM_QUERYENDSESSION和WM_ENDSESSION窗口消息(我返回new IntPtr(1);
)使我的應用程序與RestartManager兼容。RestartManager無法在更新期間重新啓動應用程序
如果我嘗試手動更新我的應用程序,然後一切正常,因爲它應該:
- 啓動應用程序;
- 啓動包含新應用程序版本的msi文件;
- 在安裝/更新期間,系統提示我關閉正在運行的應用程序;
- 繼續運行的應用程序關閉,安裝完成,並重新啓動應用程序;
如果我嘗試更新應用程序本身我的應用程序,然後我碰到的問題:
1)啓動應用程序;
2)下載新的msi文件;
3)啓動msi文件與:
using (System.Diagnostics.Process p = new System.Diagnostics.Process())
{
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "msiexec";
p.StartInfo.Arguments = "/i \"" + downloadPath + "\" /passive";
p.StartInfo.UserName = "Administrator";
p.StartInfo.Password = securePassword;
p.Start();
}
4)由於我使用的被動模式下,應用程序被自動關閉;
5)安裝後,我的應用程序不會重新啓動,並在事件查看器我有一個
事件10007 - 應用程序或服務「MyApp的」無法重新啓動。
我曾嘗試:
- 不使用被動模式MSIEXEC;
- 通過cmd.exe啓動msiexec(cmd.exe/C「msiexec/i ....」) - 希望從其他進程啓動msiexec可以解決問題;
- 等待60多秒啓動MSI更新之前(不應該在我的情況有關,但MSDN文檔中有一些事情...)
但沒有以上已經工作(總是相同的結果)。
不必啓動以提升的權限設置可能有一些做的問題,因爲在手動更新過程中出現了在事件查看器的警告 - 應用MyApp的(PID 3220)無法重新啓動 - 應用SID不匹配指揮SID。
儘管如此,重新啓動應用程序仍然有效。谷歌的警告沒有產生好的/具體的結果,只是這個警告可能是由提升提示運行msi引起的。
如何解決(或解決方法)此問題,以便我可以從應用程序本身更新我的應用程序,然後重新啓動我的應用程序?
編輯 - 額外的測試:
- 似乎有不被需要,以WM_QUERYENDSESSION WM_ENDSESSION和消息作出響應,因爲手動升級過程中重新啓動應用程序的工作原理沒有他們,因此我們可以排除他們出去;
- 如果我沒有爲應用程序啓動的升級提供管理員憑據,而是在升級過程中輸入它們,那麼應用程序重新啓動將工作;
- 如果我運行提升的命令提示符並從那裏啓動應用程序升級(手動),那麼應用程序重新啓動仍然有效;
- 爲了讓應用程序升級在標準用戶帳戶下工作(迄今爲止我使用UAC以管理員帳戶進行了測試),那麼我還必須設置
p.StartInfo.LoadUserProfile = true;
。否則沒有任何反應(雖然應用程序重啓仍然不起作用); - 我嘗試了所有其他可以設置的StartInfo參數 - WorkingDirectory,Redirect,Verb
(=「runas」) - 結果沒有變化; - 我將Vista SP2安裝到我一直在測試的虛擬機上(到目前爲止運行SP1),但沒有更改;
- 我使用詳細日誌記錄執行了「自動」應用程序升級。最後出現錯誤消息 - RESTART MANAGER:重新啓動應用程序時失敗。錯誤:352。該錯誤代碼是非常通用的(http://msdn.microsoft.com/cs-cz/library/aa373665),爲了獲得更詳細的信息,我將不得不編寫自己的安裝程序,在調用錯誤後會調用RmGetList,那麼我可能會得到更多的細節(雖然這是我不太願意的去做);
編輯2 - MSI日誌文件:
http://mommi.planet.ee/muu/log.txt
你試過直接使用MSI API ['MsiInstallProduct'(http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315.aspx)?不幸的是,我不知道它在.Net環境中的對應物。 –
我以前沒有嘗試過這個MSI API,但我放棄了它。兩個問題 - 1)該API不支持RestartManager(它要求我重新啓動計算機); 2)似乎沒有辦法通過管理員權限(在我的方案中必須)。 – Marko
可否請您提供msi安裝的日誌文件。您可以通過添加參數「/ l * v%temp%\ mylog.log」將其從msiexec中取出。這可能會給我們提供關於他的問題的線索 – weberik