c# - 我如何杀死具有特定位置 C# 的进程 exe

标签 c# exe

如果我在日志文件中发现错误并重新启动它,我需要终止一个 exe。这里的主要问题是,我不能只根据名称删除 exe,因为我有从不同文件夹运行的相同 exe,例如 D:\A\A1.exe 和 D:\B\A1.exe。我只想从“A”文件夹中删除 exe。

我尝试遵循 Dirk Vollmar 的解决方案 (https://stackoverflow.com/a/2238316/5159431)。

这个问题 - C# Process Killing

但是,当我调试他的解决方案时,我发现 hModuleSnap 变量是无效的。

更新 - 1

正如 Micky 所建议的,我使用了 Simon's Answer。它确实杀死了 exe(谢谢)。但是,我收到一条错误消息:“System.ComponentModel.Win32Exception:只完成了 ReadProcessMemory 或 WriterocessMemory 请求的一部分”。

这是示例代码。

string path1 = @"F:\Software\Application\Runner.exe";


        try
        {
            Process[] runningProcesses = Process.GetProcesses();

            foreach (Process process in runningProcesses)
            {
                // now check the modules of the process
                foreach (ProcessModule module in process.Modules)
                {
                    if (module.FileName.Equals(path1))
                    {
                        process.Kill();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
        }

最佳答案

只需根据 Simon's answer 使用 ProcessModule.FileName .注意 FileName 返回完整路径,这在帖子中并不明显。

MSDN:

Gets the full path to the module. More...

运算符(operator):

But, when I debug his solution, I found that hModuleSnap Variable is invalid.

你不应该要求这个。同时 Dirk's answer很好,它相当冗长,我觉得过度使用 native 调用。

或者,您可以使用我的 Simon 答案的简化版本(同样没有本地调用):

注意:您必须运行以下代码提升

string targetProcessPath = @"c:\windows\system32\notepad.exe";
string targetProcessName = "notepad";

Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
    if (process.ProcessName == targetProcessName && 
        process.MainModule != null &&
        string.Compare(process.MainModule.FileName, targetProcessPath, StringComparison.InvariantCultureIgnoreCase)==0)
    {
        process.Kill();
    }
}

上面的例子没有围绕比较路径的子模块循环,因为 Process 已经有一个很好的 MainModule 属性,我们可以检查。

现在上面的例子并没有那么令人兴奋,但它确实允许您对运行在计算机硬盘驱动器各个部分的名为 kitty 的进程进行核对。您可能有一个 c:\a\kitty.exed:\b\kitty.exe

关于c# - 我如何杀死具有特定位置 C# 的进程 exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38259023/

相关文章:

c# - 是否可以使用 Roslyn 创建可移植类库?

c# - 使用 Roslyn 检测 lambda 表达式的长度

delphi - 我如何确定在没有源代码的 Delphi 程序中使用了哪些库?

vbscript - FSO DeleteFolder() 方法不起作用

c++ - 在 C++ 中,导入 .exe 是什么意思?

c# - 访问套接字应用程序的 HttpClient

c# - 如何限制哪些类可以更改另一个非相关类中字段的值

c# - 未处理的异常错误缺少 resx

exe - 在 casperjs 中启动 slimerjs 的正确方法是什么(使用绝对路径)?

parameters - 自解压 zip 接受参数