代码之家  ›  专栏  ›  技术社区  ›  Mike Webb

如何在C#中启动进程,但只有在卸载了所有程序集之后才能运行它?

  •  2
  • Mike Webb  · 技术社区  · 15 年前

    我有一个程序,从一个加载的程序集中生成另一个进程。第二个进程将获取生成它的程序的安装程序(还不清楚吗?)。第二个过程只是从特定的网址启动安装程序:

    System.Diagnostics.Process.Start(www.mySite.com/myInstaller.exe);
    

    问题是,如果在卸载父程序的程序集之前运行此安装程序,它将无法正确安装,因为在安装过程中需要重写程序集的两个程序集。

    我们需要从父程序调用此进程。

    我的问题是如何生成这个进程,以便它只在卸载程序集之后运行?有没有更好的方法来做这些?

    4 回复  |  直到 15 年前
        1
  •  2
  •   KeithS    15 年前

    所以基本上,你有一个“自我更新”的应用程序。你的主应用程序调用一个更新程序,更新程序会找到安装程序并运行它。安装程序随后运行,并且可以轻松地替换调用更新程序的程序集和更新程序。安装程序完成后,重新启动应用程序。

        2
  •  3
  •   Dirk Vollmar    15 年前

    在子进程中检查父进程是否已退出。

    假设您知道应用程序的名称,这将是一个简单的检查:

    Process[] processes = Process.GetProcessesByName("calc");
    Array.ForEach(processes, p => p.WaitForExit());
    
        3
  •  0
  •   Keith Nicholas    15 年前

    尽管如此,我的许多软件都有自动更新,从来没有遇到过这个问题。

        4
  •  0
  •   Ondrej Svejdar    11 年前

    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();
      }
    }
    

    只要你的应用程序和你的安装程序都在使用它,你就可以了。(如果您想允许应用程序的多个实例,请不要在应用程序中使用“cannotconenue-MyMutex正在使用中,只在您的安装程序中)。