繁体   English   中英

如何检查进程是否由 Visual Studio > 2015 启动

[英]How can I check if a process was started by Visual Studio > 2015

在 Visual Studio 2015 中,可以通过检查调试器是否处于活动状态以及进程是否为 vshost.exe 来检查正在运行的应用程序是否已从 Visual Studio 启动,如下所示:

bool isInVisualStudio = Debugger.IsAttached && AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe");

从 Visual Studio 2017 开始,这不再可能,因为当前域始终是应用程序可执行文件名称,无论它是如何启动的。

我一直在尝试在 VS2019 中做同样的事情,但没有成功。 我能得到的最接近的是检查是否附加了调试器以及 Visual Studio 是否同时运行:

bool devEnvIsRunning = Process.GetProcessesByName("devenv").Length > 0;
bool isInVisualStudio = Debugger.IsAttached && devEnvIsRunning;

出于我的目的,这个问题是我想跳过一些代码,当它在我的机器上的 VS 副本中从源代码运行时,但我绝对不想仅仅因为安装了另一个调试器而跳过该代码。

我一直试图找到一种方法来获取可以解决问题的附加调试器的名称,但一直无法这样做。

任何人都对如何在 VS2019 中实现在 VS2015 及更早版本中如此简单的方法有任何建议?

我认为实现这一目标的最简单方法是使用命令行参数或环境变量。

命令行参数可以在项目属性中项目的调试选项卡中配置,然后您可以通过检查Environment. GetCommandLineArgs来查看传递了哪些参数Environment. GetCommandLineArgs Environment. GetCommandLineArgs用于您可能期望的任何值。 你可以随时这样做,你应该很好。

如果您不想设置命令行变量,则使用环境变量也可以。 基本思路是一样的,可以在debug选项卡中配置环境变量(有些项目默认有VS特定的变量)并查看。 我不确定如何从记忆中准确地做到这一点,而且我目前正在手机上打字,但其中一个选项应该涵盖您。

我个人会选择命令行参数选项。 它允许您在任何时候跳过任何您想跳过的任务,而不仅仅是在 VS 启动程序时。

答案原来在 Hans Passant 提供的评论中引用了他对另一个问题的回答: stackoverflow.com/a/2533287/17034

按照 Hans 的建议使用 WMI,并像以前一样检查新的远程调试器 MSVSMON 而不是 DEVENV,我们得到了我们需要的答案:

using System.Management;

var myId = Process.GetCurrentProcess().Id;
var query = $"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {myId}";
var search = new ManagementObjectSearcher("root\\CIMV2", query);
var results = search.Get().GetEnumerator();
results.MoveNext();
var queryObj = results.Current;
var parentId = (uint)queryObj["ParentProcessId"];
var parent = Process.GetProcessById((int)parentId);
bool isInVisualStudio = parent.ProcessName.ToLower() == "msvsmon";

这甚至允许我们免除对 Debugger.IsAttached 的调用,因为如果父进程调试器,则必须附加它。

我很乐意接受汉斯的回答,但他只是作为评论而已。 因此,我发布了答案,以防其他人需要它,但我非常感激地承认答案几乎完全来自 Hans Passant。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM