下面是我启动该过程的代码,仅为演示添加链接。我希望此过程在后台运行而无需打开浏览器。第二行抛出异常
对象引用未设置为对象的实例。
var process=Process.Start("http://www.google.com");
process.WaitForExit();
答案 0 :(得分:4)
因为当您启动进程间接时,您将无法获得Process
对象(然后在您的情况下,进程始终为null
,第二行将引发异常)。< / p>
让我用间接解释我的意思:如果你没有指定可执行文件但是你给了一个文档(或资源)那么它将被执行通过shell动词。在这种情况下,可以(重新)使用现有过程。在这种情况下,Process.Start()
将返回null
。
试试这个:
Process.Start(@"c:\test.docx"); // Returns a Process instance
Process.Start(@"c:\test.docx"); // Returns null
你能简单地解决这个问题吗?您不能使用AFAIK,因为Process
使用ShellExecuteEx
结构SHELLEXECUTEINFO
来启动流程。阅读hProcess
字段的WebClient.DownloadFile()
文档,您会看到:
新启动的应用程序的句柄。除非将fMask设置为SEE_MASK_NOCLOSEPROCESS,否则此成员在返回时设置并始终为NULL。即使fMask设置为SEE_MASK_NOCLOSEPROCESS,如果没有启动进程, hProcess将为NULL。例如,如果要启动的文档是URL并且Internet Explorer的实例已在运行,则它将显示该文档。没有启动新进程,并且hProcess将为NULL。 注意即使作为调用结果启动了进程,ShellExecuteEx也不会始终返回hProcess。例如,当您使用SEE_MASK_INVOKEIDLIST调用IContextMenu时,hProcess不会返回。
注意如果您正在运行新流程只是为了打开网址并获取服务器端生成的文件,那么您应该关注SHELLEXECUTEINFO并使用{{1}}。< / p>
答案 1 :(得分:1)
Process.Start()
可以返回空引用:
返回值 键入:System.Diagnostics.Process
与流程资源关联的新Process组件,如果没有启动流程资源,则为(例如,如果重用现有流程)。
(强调我的)
如果发生这种情况,您在尝试拨打NullReferenceException
时会收到WaitForExit()