我尝试了两种不同的方法来启动一个过程。

第一个

该定义被定义为Start方法的参数:
System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));
我的想法:

这个开始很好,但是我不知道如何从中获得反馈。

第二个

我开始研究ProcessStartInfo是因为我想知道Excel是否成功启动-例如,虽然很有可能它在用户的计算机上存在,但无法保证,而且我向用户表明它已启动很愚蠢。如果没有成功则成功。

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = "excel",
                Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
                ErrorDialog = true,
                UseShellExecute = false,
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            try
            {
                System.Diagnostics.Process.Start(startinfo);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

我的想法:

这将产生错误:“系统找不到指定的文件”,但尚不清楚它是Excel应用程序还是我的文件。无论如何,尽管我很欣赏错误消息的功能,但我现在不应该接受。

关于如何知道这是否成功的想法,建议和想法?

解决了

我将启动过程的第一种方法放入了try-catch中,并且效果很好。

最佳答案

Process.Start()上的MSDN页面指出,此方法具有Boolean类型的重载,其中的返回值表示:



此外,它可能引发三个异常:

  • InvalidOperationException

  • 在流程组件的StartInfo中未指定文件名。

    -或者-

    StartInfo属性的ProcessStartInfo.UseShellExecute成员为true,而ProcessStartInfo.RedirectStandardInput,ProcessStartInfo.RedirectStandardOutput或ProcessStartInfo.RedirectStandardError为true。
  • Win32Exception

  • 打开关联文件时出错。
  • ObjectDisposedException

  • 处理对象已被处置。

    要使用Process.Start()的重载(这是方法的唯一非静态重载),您需要使用ProcessStartInfo对象创建Process类的实例。

    下面是一个示例:
    ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");
    
    Process process = new Process();
    process.StartInfo = processStartInfo;
    if (!process.Start())
    {
        // That didn't work
    }
    

    但是,鉴于仍然可以抛出该错误,您最好将一个catch包裹在一个静态.Start()方法调用周围。

    鉴于此,似乎很明显,对Process.Start()的调用将起作用或不起作用,您可以从返回值为0(或引发异常)中确定这一点。

    流程启动后,您便可以对事物进行大量控制,使用诸如HasExited之类的Process类的属性可以检查流程的状态。

    简而言之-如果用户的计算机上没有Excel,则Process.Start()将引发异常。

    10-05 21:25