我尝试了两种不同的方法来启动一个过程。
第一个
该定义被定义为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类型的重载,其中的返回值表示:
此外,它可能引发三个异常:
在流程组件的StartInfo中未指定文件名。
-或者-
StartInfo属性的ProcessStartInfo.UseShellExecute成员为true,而ProcessStartInfo.RedirectStandardInput,ProcessStartInfo.RedirectStandardOutput或ProcessStartInfo.RedirectStandardError为true。
打开关联文件时出错。
处理对象已被处置。
要使用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()将引发异常。