我正在开发一个安装系统范围键盘钩子的应用程序.当我从visual studio内部运行调试版本时,我不想安装这个钩子(否则它会挂起工作室,最终挂起系统),我可以通过检查是否定义了DEBUG符号来避免这种情况.
但是,当我调试应用程序的发布版本时,有没有办法检测它是否已从visual studio内部启动以避免同样的问题?因为我一直在处理发布版本,并且想要使用忘记切换回调试版本的调试器修复一些错误,所以必须重新启动工作室/计算机是非常烦人的.
目前我使用这样的方法来检查这种情况:
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); string moduleName = currentProcess.MainModule.ModuleName; bool launchedFromStudio = moduleName.Contains(".vshost");
我称之为"蛮力方式",这在我的设置中有效,但我想知道是否有另一种(更好的)方法来检测这种情况.
尝试: System.Diagnostics.Debugger.IsAttached
对于那些使用Windows API的人来说,有一个函数可以让你看看是否存在任何调试器:
if( IsDebuggerPresent() ) { ... }
参考:http://msdn.microsoft.com/en-us/library/ms680345.aspx
测试当前进程的模块名称是否包含字符串".vshost"是我发现确定应用程序是否在VS IDE中运行的最佳方法.
使用System.Diagnostics.Debugger.IsAttached属性也不错,但它不会让你,如果你正在运行通过VS IDE的EXE文件区分开运行命令,或者如果你是直接运行调试版本(例如,使用Windows资源管理器或快捷方式)然后使用VS IDE连接到它.
您看到我曾经遇到过(COM相关)数据执行保护错误的问题,该错误要求我运行一个Post Build事件,该事件将在VS生成的EXE上使用/ NXCOMPAT:NO参数执行editbin.exe.
出于某种原因,EXE没有被修改,如果你只是打F5并运行程序,因此AccessViolationExceptions将在DEP违规代码,如果从VS IDE中运行发生-这使得它非常难以调试.但是,我发现如果我通过快捷方式运行生成的EXE然后连接VS IDE调试器,那么我可以在没有发生AccessViolationExceptions的情况下测试我的代码.
所以现在我已经创建了一个使用"vshost"方法的函数,如果我只是在VS IDE中进行日常编程,我可以用来警告或阻止某些代码运行.
这可以防止那些令人讨厌的AccessViolationExceptions被引发,从而致命地崩溃我的应用程序,如果我无意中尝试运行我知道会让我感到悲伤的事情.