Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用特定位置C终止进程exe#_C#_Exe - Fatal编程技术网

C# 如何使用特定位置C终止进程exe#

C# 如何使用特定位置C终止进程exe#,c#,exe,C#,Exe,如果在日志文件中发现错误并重新启动,我需要杀死一个exe。这里的主要问题是,我不能仅仅根据名称删除exe,因为我在不同的文件夹中运行相同的exe,例如D:\A\A1.exe和D:\B\A1.exe。我只想从“A”文件夹中删除exe 我试着遵循德克·沃尔马尔的解决方案() 就这项问题— 但是,当我调试他的解决方案时,我发现hModuleSnap变量无效 更新-1 正如米奇建议的那样,我使用了西蒙的答案。它确实杀死了exe(谢谢)。但是,我收到一个错误,提示“System.ComponentMode

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

我试着遵循德克·沃尔马尔的解决方案()

就这项问题—

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

更新-1

正如米奇建议的那样,我使用了西蒙的答案。它确实杀死了exe(谢谢)。但是,我收到一个错误,提示“System.ComponentModel.Win32Exception:ReadProcessMemory或WriteProcessMemory请求仅完成了一部分”

下面是示例代码

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();
        }

只需按照使用
ProcessModule.FileName
。注意
FileName
返回完整路径,这在文章中并不明显

MSDN:

获取模块的完整路径

作品:

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

你不应该要求这个。虽然很好,但它相当冗长,我觉得过度使用本机调用

或者,您可以使用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

谢谢@MickyD。你已经回答了这个错误。CheersHi@MickyD,我在以普通用户身份运行代码时遇到一个拒绝访问错误。如果我以管理员身份运行,那么它将成功运行。我理解用户可能无法访问系统进程。我还尝试将构建平台从32位更改为64位,但没有成功helped@RaviVyas如前所述,您必须“必须运行以下代码”-换句话说,作为管理员@Tommix不,可能有多个记事本运行实例。您是否尝试过process.StartInfo?“System.ComponentModel.Win32Exception”-我在枚举某些操作系统时遇到过这个问题。您可以通过不枚举
process.Modules
而直接读取
process.MainModule
来修复它。更高效,更重要的是,没有例外。此外,您不应使用新问题更新您的问题-将原始问题保持不变作为新问题发布:)