36

我正在开发一个安装系统范围键盘挂钩的应用程序。当我从 Visual Studio 内部运行调试构建时,我不想安装这个钩子(否则它会挂起工作室并最终挂起系统),我可以通过检查是否定义了 DEBUG 符号来避免这种情况。

但是,当我调试应用程序的发布版本时,有没有办法检测它已经从 Visual Studio 内部启动以避免同样的问题?不得不重新启动工作室/计算机非常烦人,只是因为我一直在处理发布版本,并且想要使用调试器修复一些错误,而忘记切换回调试版本。

目前我使用这样的东西来检查这种情况:

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

我将其称为“蛮力方式”,它适用于我的设置,但我想知道是否有另一种(更好的)方式来检测这种情况。

4

3 回答 3

68

尝试:System.Diagnostics.Debugger.IsAttached

于 2008-09-19T13:29:53.800 回答
19

对于那些使用 Windows API 的人,有一个函数可以让您查看是否存在任何调试器,使用:

if( IsDebuggerPresent() )
{
    ...
}

参考:http: //msdn.microsoft.com/en-us/library/ms680345.aspx

于 2008-09-19T13:43:15.313 回答
5

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

使用System.Diagnostics.Debugger.IsAttached属性也可以,但它不允许您区分是通过 VS IDE 的运行命令运行 EXE 还是直接运行调试版本(例如,使用 Windows 资源管理器或快捷方式) 然后使用 VS IDE 附加到它。

您会看到我曾经遇到过(COM 相关)数据执行保护错误的问题,该错误要求我运行一个构建后事件,该事件将在 VS 生成的 EXE 上使用/NXCOMPAT:NO参数执行editbin.exe 。

由于某种原因,如果您只是按F5并运行程序,则 EXE 没有被修改,因此如果从 VS IDE 中运行违反 DEP 的代码,则会发生AccessViolationExceptions - 这使得调试变得非常困难。但是,我发现如果我通过快捷方式运行生成的 EXE,然后附加 VS IDE 调试器,我就可以在不发生 AccessViolationExceptions 的情况下测试我的代码。

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

这可以防止那些讨厌的 AccessViolationExceptions 被引发,从而在我无意中尝试运行我知道会导致我悲伤的东西时致命地使我的应用程序崩溃。

于 2012-08-24T03:47:49.833 回答