Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道Process.Start()是否成功?_C#_.net_Excel_Process - Fatal编程技术网

C# 如何知道Process.Start()是否成功?

C# 如何知道Process.Start()是否成功?,c#,.net,excel,process,C#,.net,Excel,Process,我尝试了两种不同的方法来启动流程 第一个 定义定义为启动方法的参数: System.Diagnostics.Process.Start(“excel”,string.Format(“\”{0}\”,ExcelFileBox.Text.ToString()) 我的想法: 这一次开始很好,但我不知道如何从中获得反馈 第二个 我开始研究ProcessStartInfo,因为我想知道Excel是否成功启动——例如,虽然它很可能存在于用户的机器上,但无法保证,如果我向用户指出它已成功启动,而它还没有启动,

我尝试了两种不同的方法来启动流程

第一个

定义定义为启动方法的参数:

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中,它工作得很好。

您可以检查属性中的
0
(成功)值。

进程。Start()还返回一个布尔值,让您知道它是否获得了现有进程或是否启动了新进程

此外,您可以检查进程的ProcessId,以确保它已启动/仍在运行。比如:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}
上的MSDN页面声明此方法具有布尔类型的重载,其中返回值表示:

如果流程资源已启动,则为true; 如果没有新的进程资源,则为false 已启动(例如,如果现有 过程被重用)

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

  • 无效操作例外
在流程组件的StartInfo中未指定文件名

-或

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

  • Win32异常
打开关联文件时出错

  • 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
}
尽管如此,考虑到这仍然会抛出错误,您可能更倾向于仅围绕其中一个static.Start()方法调用包装一个捕获


有鉴于此,对Process.Start()的调用显然会起作用或不起作用,您可以通过返回值为0(或引发异常)来确定这一点

一旦您的流程启动,您就可以通过诸如HasExited之类的流程类属性对事情进行大量控制,从而可以检查流程处于何种状态


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

为了准确确定进程是否实际启动,我尝试查找进程id,如果它找到了进程id,它将继续,如果找不到进程id,它将输入catch并打印调试语句

try
{
     bool pathExists = File.Exists(module.ExecutionPath);
     if (pathExists)
     {
         ProcessStartInfo startArgs = new ProcessStartInfo();
         startArgs.FileName = "C:\Windows\System32\notepad.exe";
         startArgs.Arguments = null;
           
         Process process = new Process();
         process.StartInfo = startArgs;
         process.Start();
            
        Process startedProcess = CheckIfProcessStarted(process);
     }
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message + "  " + ex.InnerException);
    Debug.WriteLine("Couldnt find the process so it never ran");
}
        
private Process CheckIfProcessStarted(Process process)
{
    return Process.GetProcessById(process.Id);
}

这似乎并不能真正解决问题。。在程序退出之前,它不会让我确定该值。如果没有,那么我会得到一个新的错误。但是,这确实让我找到了一个显而易见的解决方案,那就是结束这个该死的过程。从一个try-catch语句开始。我觉得自己像个白痴。我检查的第一件事就是退回一个bool,但显然还不够彻底。谢谢。恰恰相反,即使我也没那么笨。。。进程。开始(字符串,字符串)返回进程:。仍然是一个try-catch可以做到这一点。@emragins对此表示抱歉-我更新了关于bool版本如何工作的答案(我自己还没有完全理解文档)。它只是返回bool的Process.Start()的重载之一。但正如我在上面所说的,我认为不管怎样,你们最好还是尝试一下接球。将其作为答案发布。依赖Process.start()显然并不总是有效的,因为该流程可能已经启动,而您的流程对象只是在重新使用现有流程,这将返回false。Win32异常的try catch绝对是解决特定场景的方法。