2008-09-19 51 views
32

我正在研究安装系统范围键盘 钩子的应用程序。我不想在Visual Studio中运行调试 构建时安装此钩子(否则它将挂起工作室 并最终导致系统),我可以通过检查是否定义了 DEBUG符号来避免此问题。检查应用程序是否从Visual Studio中启动

然而,当我调试发行版本的应用程序,是 有一种方法来检测,它已开始从视觉 工作室里面,以避免同样的问题?由于我一直致力于 的发布版本,并且希望用忘记切换回调试版本的调试器修复一些错误,所以不得不 重新启动工作室/计算机,这非常烦人。

目前我使用这样的检查这样的情景:

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
string moduleName = currentProcess.MainModule.ModuleName; 
bool launchedFromStudio = moduleName.Contains(".vshost"); 

我会将此称为“暴力方式”,这在我的设置工作,但我想知道是否有另一种(更好)的方法来检测这种情况。

+0

注:尝试这种技术时vstest.executionengine.x86.exe WebDev.WebServer20.exe 从Visual Studio测试,并通过IIS下运行快速启动代码,我得到了下面的字符串。所以任何人阅读这个可能需要相应地调整代码。 – 2015-08-07 09:23:26

回答

57
+0

(更新后的评论)Debugger.IsAttached已经足够,将满足很多要求。但是它只涉及调试器是否连接(任何调试器,包括WinDbg)。如果在没有调试的情况下在IDE中运行,它不会像广告一样工作。 OP的建议代码是确定程序是否在IDE中运行的最佳方式。注意:CodedUI测试不使用“vshost”。相反,他们使用QTAgent.exe,QTAgent32.exe和QTAgent64.exe等等。所以使用`moduleName.ToLower.Contains(“qtagent”);`。 – Barniferous 2016-09-30 17:43:44

+0

@Barniferous,看起来像从VS 2017开始检查“.vshost”不再适用,因为VS 2017已停止将其添加到名称。我不知道CodedUI测试是做什么的... – Jim 2017-03-23 17:41:32

-2

我强烈建议不要使用仅在调试时运行的代码。为什么?您希望确保进行生产的是您在本地测试/查看的内容。特别是您使用的较低级别的语言,因为代码中的差异会导致编译器以不同的方式生成机器/ IL。

也许出于发现问题的目的,但就是这样。

+2

在这种情况下,实际上是另一种方式。钩子干扰我能够调试(敲击一个键导致工作室,并最终每个其他应用程序,我尝试输入的东西冻结,因为事件无法处理),所以我不安装它们在调试版本。 – Grimtron 2008-09-19 13:43:41

+0

我不同意这张海报。我遇到过很多场合,我需要嵌入仅在IDE中运行或从未在IDE下运行的代码。你编写代码,单独测试heck,并确保它能正常工作,然后添加代码,以便它只在IDE中运行时运行。 – Barniferous 2016-09-30 12:00:54

5

测试是否当前的模块名称进程包含字符串“.vshost”是我发现的用于确定应用程序是否在VS IDE中运行的最佳方式。

使用System.Diagnostics.Debugger.IsAttached属性也不错,但它不会让你,如果你正在运行通过VS IDE的运行命令的EXE或如果您正在运行调试区分直接构建(例如,使用Windows资源管理器或快捷方式),然后使用VS IDE连接到它。

你看,我曾经遇到过一个问题,需要我跑(COM相关的)数据执行保护错误后生成事件将与/NXCOMPAT执行editbin.exe:NO VS生成的EXE参数。

出于某种原因,因此AccessViolationExceptions将在DEP违规代码,如果从VS IDE中运行出现的EXE没有被修改,如果你只是打F5并运行程序,并 - 这使得它非常困难进行调试。但是,我发现如果通过捷径运行生成的EXE,然后附加VS IDE调试器,则可以在不发生AccessViolationExceptions的情况下测试我的代码。

所以现在我创建了一个函数,它使用“vshost”方法,我可以用它来警告或阻止运行某些代码,如果我只是在VS IDE中进行日常编程研究。

这可以防止那些讨厌的AccessViolationExceptions被引发,从而导致我的应用程序崩溃,如果我无意中尝试运行我知道会导致我悲伤的事情。

相关问题