我正在开发一个安装系统范围键盘的应用程序 钩。我在运行调试时不想安装此挂钩 从视觉工作室内部构建(否则它将挂起工作室 并最终系统),我可以通过检查是否可以避免这种情况 DEBUG符号已定义。
但是,当我调试应用程序的发布版本时,是 有一种方法来检测它是从视觉内部开始的 工作室避免同样的问题?这是非常烦人的 重启工作室/电脑,只是因为我一直在努力 发布版本,并希望使用调试器修复一些错误 忘记切换回调试版本。
目前我使用这样的方法来检查这种情况:
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
string moduleName = currentProcess.MainModule.ModuleName;
bool launchedFromStudio = moduleName.Contains(".vshost");
我称之为“蛮力方式”,这在我的设置中有效,但我想知道是否有另一种(更好的)方法来检测这种情况。
答案 0 :(得分:62)
答案 1 :(得分:16)
对于那些使用Windows API的人来说,有一个函数可以让你看看是否存在任何调试器:
if( IsDebuggerPresent() )
{
...
}
答案 2 :(得分:5)
测试当前进程的模块名称是否包含字符串“.vshost”是我发现确定应用程序是否在VS IDE中运行的最佳方法。
使用 System.Diagnostics.Debugger.IsAttached 属性也没关系,但它不允许您区分是否通过VS IDE 运行>运行EXE em> 命令或者您是直接运行调试版本(例如,使用Windows资源管理器或快捷方式),然后使用VS IDE附加到它。
您看到我曾遇到过与(COM相关)数据执行保护错误的问题,该错误要求我运行 Post Build Event 以执行 editbin VS生成的EXE上带有 / NXCOMPAT:NO 参数的.exe 。
出于某种原因,只要点击 F5 并运行程序就不会修改EXE,因此在DEP违反时会出现 AccessViolationExceptions 代码如果从VS IDE中运行 - 这使得调试非常困难。但是,我发现如果我通过快捷方式运行生成的EXE然后连接VS IDE调试器,那么我可以在没有发生AccessViolationExceptions的情况下测试我的代码。
所以现在我已经创建了一个使用“vshost”方法的函数,如果我只是在VS IDE中进行日常编程研究,我可以用它来警告或阻止某些代码运行。
这可以防止那些令人讨厌的AccessViolationExceptions被提升,从而导致我的应用程序崩溃,如果我无意中尝试运行我知道会让我感到悲伤的事情。
答案 3 :(得分:-2)
我强烈反对使用仅在调试时运行的代码。为什么?您希望确保生产中的内容是您在本地测试/查看的内容。对于您使用的低级语言尤其如此,因为代码中的差异经常导致编译器以不同方式生成您的机器/ IL。
也许是为了发现一个问题,但那是关于它的。