我正在使用c#,。net 4,WIX 3.5,Windows Vista。
我通过p /调用RegisterApplicationRestart方法并处理WM_QUERYENDSESSION和WM_ENDSESSION窗口消息(我返回new IntPtr(1);
)使我的应用程序与RestartManager兼容。
如果我尝试手动更新我的应用程序,那么一切正常:
如果我尝试从应用程序本身更新我的应用程序,那么我遇到了问题:
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”。
我试过了:
但以上都没有奏效(总是相同的结果)。
必须使用提升的权限启动安装程序可能与此问题有关,因为在手动更新期间,我在事件查看器中收到警告 - 应用程序MyApp(pid 3220)无法重新启动 - 应用程序SID执行不匹配导体SID 。
尽管如此,重新启动应用程序仍然有效。谷歌警告没有产生好的/特定的结果,只是这个警告可能是由于在提示的提示中运行msi引起的。
如何修复(或解决)此问题,以便我可以从应用程序本身更新我的应用程序并在之后重新启动我的应用程序?
修改 - 额外测试:
p.StartInfo.LoadUserProfile = true;
。否则没有任何反应(应用程序重启仍然无法正常工作); 编辑2 - msi日志文件:
http://mommi.planet.ee/muu/log.txt
答案 0 :(得分:0)
假设手动过程确实没有任何问题,似乎您需要管理员权限与“更新本身”相结合会导致这些问题。我看到以下选项:
创建批处理文件以执行更新
当您想要更新调用此批处理文件(具有提升的权限)时,让应用程序自行关闭...批处理文件应等待几秒钟,然后检查应用程序是否仍在运行(并在以后关闭它)然后运行您需要运行msiexec
的命令行 - 不要在msiexec中重新启动应用程序,但是在批处理文件中成功运行msiexec
之后。
创建一个始终用于启动应用程序的批处理文件 当需要更新时,您只需结束应用程序。批处理文件检查可用更新并应用它,在成功更新后启动应用程序或应用程序设置一些环境变量,然后由批处理文件的其余部分进行相应处理。