静默运行时WPF程序无法正常运行

时间:2017-02-07 15:05:23

标签: c# .net wpf

我编写了一个小程序来在客户端计算机上执行快速配置,它需要能够使用GUI并从命令行静默运行。如果我使用GUI运行它然后它完美地工作,但是如果我尝试运行它而没有它只是挂起。

我已经将问题追溯到这部分代码:

    string arg = "/C:\"setup.exe /qn ADD_OPINSIGHTS_WORKSPACE=1 OPINSIGHTS_WORKSPACE_ID=" + workSpaceID + " OPINSIGHTS_WORKSPACE_KEY=" + workSpaceKey + " AcceptEndUserLicenseAgreement=1\"";
log.Info(arg);

// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "MMASetup-AMD64.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = arg;

try
{
    log.Info("try entered");
    // Start the process with the info we specified.
    // Call WaitForExit and then the using statement will close.
    using (Process exeProcess = Process.Start(startInfo))
    {
        log.Info("Install started");
        exeProcess.WaitForExit(30000);
        log.Info("Install exit code: " + (exeProcess.ExitCode).ToString());
        return (exeProcess.ExitCode).ToString();
    }
}
catch (Exception e)
{
    log.Error("MMA install threw an error: ", e);
    return e.Message;
}

此方法与GUI和静默代码分开,并以完全相同的方式运行,但只到达#34;安装已启动"当默默地运行。我知道exe确实完成了所以我尝试使用此解决方案中的代码,但遇到了同样的问题: ProcessStartInfo hanging on "WaitForExit"? Why?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。

我做了一个创业课:

  public partial class Startup {

    // WPF App
    private App _app;

    [STAThread]
    public static void Main(string[] args) {
      try {
        //Do what you need
        //Check the args
        //Start your setup silent

        //start the WPF App if need it
        this._app = new App();
        this._app.InitializeComponent();
        this._app.Run();
      } catch (Exception ex) {
        //Logging ex
      }
    }

之后,您必须将Application Startup Object更改为Startup Class。

答案 1 :(得分:1)

我正在异步运行我的所有工作,因为我没有加载GUI线程Windows正在将应用程序视为控制台应用程序。而GUI线程会调用其他异步方法并等待它们完成控制台应用程序调用方法然后关闭,因为它没有任何剩下的工作要做。解决方案是明确地让主线程像这样等待:

public static void Main(string[] args)
    {
        try
        {
            Install().Wait();

        }
        catch (Exception ex)
        {

        }
    }

    private static async Task Install()
    {}