C# 启动启动进程,但返回null
我有一个windows窗体应用程序,它有一个功能:启动Edge,终止进程: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(); }
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”。