C# 启动启动进程,但返回null

C# 启动启动进程,但返回null,c#,process,C#,Process,我有一个windows窗体应用程序,它有一个功能:启动Edge,终止进程: private void Form1_Load(object sender, EventArgs e) { try { Process edgeProc = new Process(); edgeProc = Process.Start("microsoft-edge:.exe"); edgeProc.Kill(); }

我有一个windows窗体应用程序,它有一个功能:启动Edge,终止进程:

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        Process edgeProc = new Process();
        edgeProc = Process.Start("microsoft-edge:.exe");
        edgeProc.Kill();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + Environment.NewLine + Environment.NewLine + ex.StackTrace);
    }
}
我没有一台带有Win10+Edge的机器来调试这段代码,但我间接地可以访问Windows 10虚拟机。我构建应用程序并在该VM上运行exe,Edge启动,但随后引发异常:

对象引用未设置为对象的实例

在EdgeLauncher.Form1.Form1_加载(对象发送方,事件参数e)

我了解什么是
NullReferenceException
,并且非常熟悉

说:

与流程资源关联的新流程,如果没有启动流程资源,则为空。


Edge正在启动,因此
edgeProcess
不应为
null
。那么我为什么会出现这个错误呢?

您正在使用shell来执行该命令。不能保证有一个与此相关的过程。新窗口出现并不意味着新进程已经启动:)


如果您总是想启动一个新进程,请不要使用
UseShellExecute
——不用说,这本身就有复杂性。

您正在使用shell来执行该命令。不能保证有一个与此相关的过程。新窗口出现并不意味着新进程已经启动:)

如果您总是想启动一个新进程,不要使用
UseShellExecute
——不用说,这本身就有复杂性。

在这种情况下,
new process()
是无用的。你可以做:

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        Process edgeProc = Process.Start("microsoft-edge:.exe");
        edgeProc?.Kill(); // the "?." will prevent the NullReferenceException 
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + Environment.NewLine +    Environment.NewLine + ex.StackTrace);
    }
}
如果未启动任何进程,
Process.Start(…)
将返回
null

在这种情况下,
新进程()。你可以做:

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        Process edgeProc = Process.Start("microsoft-edge:.exe");
        edgeProc?.Kill(); // the "?." will prevent the NullReferenceException 
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + Environment.NewLine +    Environment.NewLine + ex.StackTrace);
    }
}

如果没有启动任何进程,
Process.Start(…)
将返回
null

我不熟悉从命令行启动UWP应用程序。但我怀疑microsoft edge:.exe由于冒号而不正确。如果它是UWP,它甚至有一个.exe吗?顺便说一句,请注意,您正在毫无意义地创建
进程的默认实例,然后当您用调用
进程.Start()的结果替换它时,它的引用立即丢失;我没注意。我最初编写了
processedgeprocess=newprocess(“microsoft edge.exe”)
或其他任何东西,但忘记了构造函数没有这种重载。拆下绳子,就这样离开了。这只是为了我自己的个人测试,同时查看更大的is,现在没有什么重要的
进程。Start()
如果无法启动进程或使用现有进程,将抛出异常。如果调用成功,它将返回null,但重用了现有进程。我不熟悉从命令行启动UWP应用程序。但我怀疑microsoft edge:.exe由于冒号而不正确。如果它是UWP,它甚至有一个.exe吗?顺便说一句,请注意,您正在毫无意义地创建
进程的默认实例,然后当您用调用
进程.Start()的结果替换它时,它的引用立即丢失;我没注意。我最初编写了
processedgeprocess=newprocess(“microsoft edge.exe”)
或其他任何东西,但忘记了构造函数没有这种重载。拆下绳子,就这样离开了。这只是为了我自己的个人测试,同时查看更大的is,现在没有什么重要的
进程。Start()
如果无法启动进程或使用现有进程,将抛出异常。如果调用成功,它将返回null,但重用了现有进程。这不会编译,至少在VS2013中不会编译,这正是我在工作中遇到的问题。C#6中提供了“?”运算符。在旧版本中,您需要检查进程是否为null:if(edgeProc!=null){edgeProc.Kill();}我知道我可以简单地添加一个检查
null
,但正如我在问题中所说,我了解什么是NRE,以及如何一般地修复它们——我只是不理解为什么在这个特定的情况下,值是
null
。正如我在回答中所说的那样,如果没有启动进程,则返回“null”。这不会编译,至少在VS2013中不会编译,这是我在工作中遇到的问题。“”运算符在C#6中可用。在旧版本中,您需要检查进程是否为null:if(edgeProc!=null){edgeProc.Kill();}我知道我可以简单地添加一个检查
null
,但正如我在问题中所说,我了解什么是NRE,以及通常如何修复它们——我只是不明白在这个特定的情况下,为什么值是
null
。正如我在回答中所说的,如果没有启动进程,则返回“null”。