为什么我在调用 process.Close() 或 process.Kill() 时得到 "No process is associated with this object."?

Why do I get "No process is associated with this object." when calling process.Close() or process.Kill()?

我有一个正在启动 TShark.exe 的 C# 程序,它是 WireShark 的后台等效项。我想关闭我启动的所有实例。它似乎开始得很好,运行 在后台并将网络流量记录到文件中。但是,当我尝试关闭它时,出现 "No process is associated with this object." 异常。

以下是我开始流程的方式:

ProcessStartInfo processStartInfo = new ProcessStartInfo
{
   Arguments = $"-i {nic} -t ad -w {GenerateLogPath(nic)}",
   FileName = "\"C:\Program Files\Wireshark\tshark.exe\"",
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false
};

WireSharkProcesses.Add(System.Diagnostics.Process.Start(processStartInfo));

我已经尝试了几种方法来 close/kill 这些过程。首先,我保留了我在我的应用程序中启动的所有进程的列表,并在它们上调用了以下但没有成功:

process.CloseWindow();
process.Close();
process.Kill();

我一直收到 "No process is associated with this object." 异常。

所以,我使用了:

var processes = System.Diagnostics.Process.GetProcesses();

并获得了我机器上所有进程的列表并遍历它们并试图关闭那些进程名称为 "tshark" 或 "dumpcap" 的进程。我尝试使用 .CloseWindow()、.Close() 和 .Kill() 进行此操作,所有这些都失败并引发了上述异常。

我什至进入 TaskManager 并试图结束对他们的任务。它们似乎已被删除,但在关闭并重新打开 TaskManager 后,它们神奇地重新出现了。现在还有几个 "tshark" 和 "dumpcap" 的实例在我调用 GetProcesses() 时出现,但不在任务管理器显示的进程列表中。

我在这里错过了什么??如果不重新启动我的机器,我如何让这些进程退出?这只是一个 wireshark 问题,还是终止进程的一般问题?

你在使用 WinPcap or Npcap? If you're using WinPcap, you could try switching to Npcap and using that instead. See Gerald Comb's comment #32 on the recently closed Wireshark Bug 14701.

顺便说一下,如果您不知道,tshark 一次可以在多个接口上进行捕获,因此理论上只需要一个实例。我知道这有时会导致重组问题,所以如果这是你想要避免的,或者如果你只是想保持数据包按接口分开,那么是的,你将不得不启动多个实例。