【问题标题】:Restart Windows App using .NET使用 .NET 重新启动 Windows 应用程序
【发布时间】:2011-01-05 16:36:43
【问题描述】:

有没有办法使用 .NET 代码重新启动用 .NET 编写的 Windows 应用程序

我的意思是应用程序应该在单击按钮时自行退出并重新启动。

【问题讨论】:

    标签: c# .net vb.net winforms


    【解决方案1】:
    【解决方案2】:

    Application.Restart() 是你的方法:)

    Here 是另一个 StackOverflow 答案,它指出了使用此方法的几个“注意事项”。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,但我的问题与无法管理的内存泄漏有关,我在必须 24/7 运行的应用程序上找不到该问题。我与客户同意,如果内存消耗超过定义的值,重新启动应用程序的安全时间是凌晨 03:00。

      我尝试了Application.Restart,但由于它似乎使用了一些在新实例已经运行时启动新实例的机制,所以我选择了另一个方案。我使用了文件系统处理持续存在直到创建它们的进程死亡的技巧。所以,从应用程序中,我将文件放到了磁盘上,并没有Dispose() 处理。我还使用该文件来发送“我自己”的可执行文件和起始目录(以增加灵活性)。

      代码:

      _restartInProgress = true;
      string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
      StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
      sw.WriteLine(Application.ExecutablePath);
      sw.WriteLine(Application.StartupPath);
      sw.Flush();
      Process.Start(new ProcessStartInfo
      {
          FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
          WorkingDirectory = Application.StartupPath,
          Arguments = string.Format("\"{0}\"", dropFilename)
      });
      Close();
      

      Close() 最后会启动应用程序关闭,我在这里用于StreamWriter 的文件句柄将保持打开状态,直到进程真正终止。那么……

      Restarter.exe 开始行动。它尝试以独占模式读取文件,防止它获得访问权限,直到主应用程序没有死,然后启动主应用程序,删除文件并存在。我想这再简单不过了:

      static void Main(string[] args)
      {
          string filename = args[0];
          DateTime start = DateTime.Now;
          bool done = false;
          while ((DateTime.Now - start).TotalSeconds < 30 && !done)
          {
              try
              {
                  StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
                  string[] runData = new string[2];
                  runData[0] = sr.ReadLine();
                  runData[1] = sr.ReadLine();
                  Thread.Sleep(1000);
                  Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
                  sr.Dispose();
                  File.Delete(filename);
                  done = true;
              }
              catch (Exception ex)
              {
                  Console.WriteLine(ex.Message);
              }
              Thread.Sleep(1000);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多