下面是我启动过程的代码,只提供演示链接。我希望这个过程在后台运行,而不打开浏览器。也是第2行抛出异常。
对象引用未设置为对象的实例。
var process=Process.Start("http://www.google.com");
process.WaitForExit();发布于 2013-12-20 10:42:10
因为当您间接启动一个进程时,您不会得到Process对象(在您的情况下,进程总是null,第二行抛出一个异常)。
让我间接地解释一下我的意思:如果您没有指定一个可执行文件,而是给出一个文档(或资源),那么它将通过shell谓词执行。在这种情况下,可以使用现有的进程。在这种情况下,Process.Start()将返回null。
试试这个:
Process.Start(@"c:\test.docx"); // Returns a Process instanceProcess.Start(@"c:\test.docx"); // Returns null你能简单地解决这个问题吗?AFAIK不能这样做,因为Process使用带有谢勒西德结构的ShellExecuteEx启动进程。阅读SHELLEXECUTEINFO文档中的hProcess字段,您将看到:
新启动的应用程序的句柄。此成员在返回时设置为空,除非fMask设置为SEE_MASK_NOCLOSEPROCESS。即使fMask设置为SEE_MASK_NOCLOSEPROCESS,如果没有启动进程,hProcess也将为NULL。例如,如果要启动的文档是URL,并且Internet Explorer的一个实例已经在运行,它将显示该文档。没有启动新进程,hProcess将为NULL。 Note ShellExecuteEx并不总是返回hProcess,即使进程是作为调用的结果启动的。例如,当您使用hProcess调用IContextMenu时,IContextMenu不会返回。
注意到如果您运行一个新进程只是为了打开一个URL并获得一个服务器端生成的文件,那么您应该遵循达米恩的建议并使用WebClient.DownloadFile()。
发布于 2013-12-20 10:43:12
Process.Start()可以返回空引用:
返回值类型: System.Diagnostics.Process 与流程资源相关联的新流程组件,如果没有启动流程资源,则为null (例如,如果重用了现有流程)。
(强调地雷)
当这种情况发生时,当尝试调用WaitForExit()时,您将得到一个WaitForExit()
https://stackoverflow.com/questions/20701716
复制相似问题