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

标签 c# .net excel process

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

第一个

定义被定义为 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 页面声明此方法具有 bool 类型的重载,其中返回值表示:

true if a process resource is started; false if no new process resource is started (for example, if an existing process is reused).

另外它可以抛出三个异常:

  • InvalidOperationException

在 Process 组件的 StartInfo 中没有指定文件名。

-或-

当 ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput 或 ProcessStartInfo.RedirectStandardError 为真时,StartInfo 属性的 ProcessStartInfo.UseShellExecute 成员为真。

  • 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
}

不过,考虑到这仍然会抛出异常,您最好只在其中一个静态 .Start() 方法调用周围添加一个 catch。


鉴于此,似乎很清楚对 Process.Start() 的调用是否有效,您可以根据返回值为 0(或抛出异常)来确定这一点。

一旦您的流程启动,您就可以对事情进行很多控制,使用 Process 类的属性(例如 HasExited)可以让您检查流程处于什么状态。

简而言之 - 如果用户的机器上没有 excel,Process.Start() 将抛出异常。

关于c# - 如何知道 Process.Start() 是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750651/

相关文章:

C# -- 是否需要检查 "obj is Person && obj != null"

c# - C# 中 try/catch 的真正开销是多少?

c# - 上下文菜单中的命令不起作用

c# - C# 应用程序与 C++ 和 VB.Net 中的其他应用程序之间的 IPC

c# - 显示没有断点的当前调用堆栈

.net - 如何从 C# 或 vb.net 读取 Excel 下拉列表或复选框的值?

VBA 跳过空白不起作用

c# - 如何在没有 Excel 或第 3 方工具的情况下将 xlsx 文件读入 .net?

c# - 在 ASP.NET Core 中使用 ADO.NET 作为数据访问层

c# - 如何在 C# 中为动态下拉列表创建事件处理程序