我开始了一个新项目,列出了所有正在运行的进程的完整路径.当访问某些进程时,程序崩溃并抛出Win32Exception.描述说明列出流程模块时发生错误.最初我认为这个问题可能会发生,因为我在64位平台上运行它,所以我重新编译它为CPU类型x86和AnyCPU.不过,我遇到了同样的错误.
Process p = Process.GetProcessById(2011);
string s = proc_by_id.MainModule.FileName;
Run Code Online (Sandbox Code Playgroud)
错误发生在第2行.空白字段显示发生错误的进程:

有没有办法绕过这个错误信息?
我想知道如果程序正在运行,我可以检查特定位置的程序.例如,c:\ loc1\test.exe和c:\ loc2\test.exe中的test.exe有两个位置.我只想知道c:\ loc1\test.exe是否正在运行,而不是所有的test.exe实例.
如果已经有实例运行,我的应用程序在加载时需要表现得略有不同.
我理解如何使用互斥锁来防止其他实例加载,但这并不能解决我的问题.
例如:
有任何想法吗?值得庆幸的是,它不需要处理多个用户帐户或类似的东西.
(C#,桌面应用程序)
编辑:为了澄清,应用程序不需要限制为单个实例,只需执行一个稍微不同的启动操作,如果还有另一个实例已经运行.多个实例都很好(并且是预期的).
如何使用taskkill从名称和特定路径中删除进程?
taskkill/F/IM
当然它无法区分2个过程从两个不同的位置开始C:\ Dir1和C:\ Dir2
任务列表是否有任何开关来获取路径名称
我试图通过pid获取进程路径,但我得到Win32Exception(访问ID被拒绝).
代码如下所示:
string path = Process.GetProcessById(pid).MainModule.FileName
Run Code Online (Sandbox Code Playgroud)
我已经尝试将OpenProcess与GetModuleFileNameEx一起使用,但OpenProcess返回0.我甚至尝试根据C#启用SeDebugPrivilege - 如何启用SeDebugPrivilege但它没有帮助.
上面的代码适用于大多数进程,但抛出SynTPHelper.exe(Synaptics Pointing Device Helper)的错误.应用程序在与我的代码相同的用户名下运行.两者,我的应用程序和进程都以64位运行.
是否可以在不以管理员身份运行我的应用程序的情况下检索路径?
编辑
任务管理器能够"打开文件位置",即使我没有以管理员身份运行它.
我想在c#中创建一个看门狗,其中用户通过他的pid选择一个进程然后是他消耗ram和CPU的应用程序监视,之后,如果该应用程序通过min消耗然后重新启动进程,那么他的CPU和ram去再次到0.
我的问题是当我想重新启动进程时,因为我可以通过他的pid获取进程,但无法重新启动,因为他想要应用程序的路径但是我不想重新启动整个应用程序我只想重启那个特定的进程
我怎么能做到这一点?可以这样做吗?
升级:
好吧,我认为通过一个例子可以更好地理解,所以这里是:
首先,想象一下我想用应用程序Microsoft Edge的pid 12780来查看进程.
其次,当这个过程超过我在看门狗中设置的RAM或CPU的最小消耗时,该过程应该重新启动,从RAM和CPU开始为0.
但是这里有问题,如果我想重新启动那个进程我可以杀了它,是的,但我无法启动它,即使我设置了我的应用程序的完整路径(在这种情况下是Microsoft Edge)它也无法启动再次.
那么,我如何只重启那个进程不是完整的应用程序?