在C#中,确定程序员是通过IDE还是用户运行程序的最佳方法是什么?

28

在C#中,最好的方法是通过检测程序是由IDE还是用户运行来确定程序员正在运行程序的方式是什么?

2个回答

35
if (System.Diagnostics.Debugger.IsAttached) {
    // You are debugging
}

当用户运行您的程序并附加调试器时,会发生什么? - Tomek Szpakowicz
tomekszpakowicz,您的意思是程序员在构建程序时将其设置为Debug而不是Release,然后用户运行生成的.exe文件? - odiseh
1
我认为他的意思是通过从bin/debug或bin/release文件夹启动.exe在IDE之外启动程序。从IDE运行应用程序并不意味着一定附加了调试器,也不意味着在IDE之外运行时没有调试器附加。 - Webleeuw
如果开发人员在调试器下启动程序(例如,使用GFLAGS使已安装的实例自动在调试器下启动以进行实时生产调试),则代码是其生产环境中的运行时可执行文件,但此解决方案将使其认为正在Visual Studio IDE下运行。检查是否连接了调试器只告诉您有一个调试器正在侦听/观察/控制,而不是代码正在IDE中运行,这就是问题所在。如何判断代码是在生产环境(正常安装)中执行还是从IDE中执行。 - StarPilot
@StarPilot:在我看来,这个问题的提问者有几个可能的问题,不是很明确。如果你对生产环境和IDE有兴趣,我曾经问过类似的问题。http://stackoverflow.com/questions/30495095/app-data-path-during-development-versus-deployment/30513360 不幸的是,到目前为止,我只收到了一个指向这里的链接,这与我的问题不同。因此,我得出结论必须间接确定它。 - ToolmakerSteve
显示剩余3条评论

7
public static bool IsInVisualStudio
{
    get
    {
        bool inIDE = false;
        string[] args = System.Environment.GetCommandLineArgs();
        if (args != null && args.Length > 0)
        {
            string prgName = args[0].ToUpper();
            inIDE = prgName.EndsWith("VSHOST.EXE");
        }
        return inIDE;
    }
}

如果(String.IsNullOrEmpty(args) == false){...} 在我看来更好 :) - Christian
1
@Christian: args 是一个字符串数组,而不是一个字符串。 - Jon Skeet
此外,将一个等式转化为 true 或 false 可能相对于 if(String.IsNullOrEmpty()) 或 if(!String.NullOrEmpty()) 来说太冗长了。不过这只是一个跑题的话题,与此问题无关。 - Webleeuw
Jon:哎呀,你说得对。我的错 :/ 我会把它归咎于早上起得太早了。Webleeuw:虽然更冗长,但我个人觉得与否定运算符相比,更容易阅读 :) - Christian
6
没问题,但是启用Visual Studio托管进程是可关闭的选项。 - Hans Passant
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接