我有一个程序从一个已加载的程序集中生成另一个进程。第二个过程进入并抓取产生它的程序的安装程序(困惑了吗?)。第二个过程只是在特定的Web地址启动安装程序:
System.Diagnostics.Process.Start(www.mySite.com/myInstaller.exe);
问题是,如果在卸载父程序的程序集之前运行此安装程序,则无法正确安装,因为在安装过程中需要覆盖一些程序的程序集。
我们需要从父程序中调用此过程。
我的问题是如何生成此进程以便它仅在程序集卸载后运行?有没有更好的方法来做这一切?
答案 0 :(得分:3)
检查子进程是否已退出父进程。
假设您知道应用程序的名称,这将是一个简单的检查:
Process[] processes = Process.GetProcessesByName("calc");
Array.ForEach(processes, p => p.WaitForExit());
答案 1 :(得分:2)
基本上,你有一个“自我更新”的应用程序。您的主应用程序调用更新程序,然后查找安装程序并运行它。然后安装程序运行,并可以轻松替换调用更新程序和更新程序的程序集。安装程序完成后,重新启动应用程序。
您可以(默认情况下为.NET)使用OS shell启动新进程。此过程与其父级没有任何关联;例如,如果你创建了一个可执行文件,其唯一目的是打开记事本,你的可执行文件将调用Process.Start(“notepad.exe”),记事本将打开,你的进程将关闭,让记事本打开。
要确保您的应用程序已关闭,您可以在安装程序中使用Process.GetProcesses(),它将获取您使用任务管理器查看的进程列表。扫描列表以查找应用程序的可执行文件名称(如果适用,请更新更新程序);如果存在,请尝试睡一会儿,然后再试一次。还在那儿?提醒用户手动关闭应用程序,然后当他们说有时,再次检查。
答案 2 :(得分:0)
如果您的安装程序是“哑”,则在完全退出主程序后,再创建另一个应用程序以启动安装程序。
尽管如此,我在许多软件中都有自动更新,从未遇到过这个问题。
答案 3 :(得分:0)
Mutex是一个专为进程间同步而设计的类。它主要在所有正在运行的进程中创建命名锁。按名称检查正在运行的进程似乎有点脏(如果有人重命名您的应用程序,该怎么办)。
样本用法:
static void Main(string[] args) {
bool wasNewMutexCreated;
using (var mutext = new Mutex(false, "MyMutext", out wasNewMutexCreated)) {
if (!wasNewMutexCreated) {
Console.Out.WriteLine("Can't continue - MyMutex is in use.");
}
// rest of your application logic
Console.In.ReadLine();
}
}
只要您的应用程序和安装程序都使用它,您就可以了。 (如果您想允许应用程序的多个实例,请不要执行“无法继续 - 在您的应用程序中使用MyMutex,只需在安装程序中使用”。