当前位置:  开发笔记 > 开发工具 > 正文

检查应用程序是否从Visual Studio中启动

如何解决《检查应用程序是否从VisualStudio中启动》经验,为你挑选了3个好方法。

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

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

目前我使用这样的方法来检查这种情况:

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

我称之为"蛮力方式",这在我的设置中有效,但我想知道是否有另一种(更好的)方法来检测这种情况.



1> TraumaPony..:

尝试: System.Diagnostics.Debugger.IsAttached


(更新的评论)Debugger.IsAttached足够并且将满足许多要求.但是它只解决是否附加调试器(任何调试器,包括WinDbg).如果在没有调试的情况下在IDE中运行,它将不会像宣传的那样始终工作.OP的建议代码是确定程序是否在IDE中运行的最佳方法.注意:CodedUI测试不使用"vshost".相反,他们使用QTAgent.exe,QTAgent32.exe和QTAgent64.exe等.所以使用`moduleName.ToLower.Contains("qtagent");`.

2> William Casa..:

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

if( IsDebuggerPresent() )
{
    ...
}

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



3> 小智..:

测试当前进程的模块名称是否包含字符串".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被引发,从而致命地崩溃我的应用程序,如果我无意中尝试运行我知道会让我感到悲伤的事情.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有