Process.StartInfo.UseShellExecute = true 是否与 Process.WaitForExit() 一起使用?

问题描述

我正在编写一个使用 process.StartInfo.UseShellExecute=true 打开 .mp4 文件的程序。

var p = new Process();
p.StartInfo = new processstartinfo("something.mp4")
{
    UseShellExecute = true
};
p.EnableRaisingEvents = true;
p.Start();
//some code
p.WaitForExit();

但是,每当我运行它时,.mp4 文件都会打开,但它正在显示

system.invalidOperationException: '没有进程与此对象关联。'

当它运行 WaitForExit() 时。有什么办法可以避免这个问题吗?

解决方法

Process.StartInfo.UseShellExecute = true 是否与 Process.WaitForExit() 一起使用?

它可以,但不是在你所拥有的场景中。

UseShellExecute(在较旧的桌面 .NET 版本中默认设置为 true,在 .NET Core 中默认设置为 false)控制 {{1} } class 将直接创建进程,或者将其委托给 Windows shell。

在后一种情况下,以这种方式使用它的主要原因之一是利用 Windows 文件关联自动选择要为您指定的文件运行的程序。但是当发生这种情况时,Process 类无法使用启动的实际进程。

只有明确指定应该运行的可执行文件,您才能在启动后实际监控进程(当然,如果您正在这样做,您实际上不需要设置{{1 }} 到 Process)。

在您的具体示例中,如果您已经知道要使用哪个程序打开 .mp4 文件,您可以更改进程启动信息,以便为 UseShellExecute 属性提供该程序的名称,然后是您要在 true 属性中打开的 .mp4 文件。当然,这假设您要使用的程序在运行时接受文件名参数,但这通常是媒体播放器类型的程序的情况。

例如,如果您想使用 Windows Media Player 播放 .mp4 文件,您可以执行以下操作:

ProcessStartInfo.FileName

请注意,您实际上可能需要指定文件的完整路径,而不仅仅是文件名,具体取决于进程最终启动的工作目录以及您尝试启动的程序如何处理该路径。但是作为一个例子,我发现 Windows Media Player 在启动进程时会忽略工作目录设置,并且将无法找到并开始播放您指定的文件,除非您提供文件的完整路径。

其他媒体播放器的行为可能相似,也可能不同。