检测程序是否由Visual Studio运行,而不是从Windows资源管理器运行

l5tcr1uw  于 2023-04-07  发布在  Windows
关注(0)|答案(7)|浏览(241)

有没有一种方法可以检测你的程序是通过Visual Studio加载的,还是作为独立的可执行文件启动的?
我们的软件有一个bug报告功能来处理未处理的异常--我们需要能够将调试构建分发给我们的beta测试人员,但我们不希望bug报告在我们处于开发中期时发出,因为如果VS用完整的堆栈跟踪捕获它们,异常会更有用。
现在,如果Application.ExecutablePath包含bin\Debug或bin\Release,我将禁用bug报告,但我认为可能有一种更健壮的方法来检测程序是否通过VS加载。
显然,我们可以使用一些预处理器宏来设置一个不同的构建,但是为了这个问题,假设这是不可能的-我不介意添加代码,但是我试图对构建过程进行最少的修改,这就是为什么命令行选项也是最后的手段。
如果重要的话,我使用的是VS 2003/.NET 1.1。

06odsfpq

06odsfpq1#

如果您这样做是为了确定它是否在任何调试器中(由 @JaredPar 澄清),则可以在异常处理程序中使用Debugger.IsAttached

try
{
    // ...
}
catch(Exception ex)
{
    if (!Debugger.IsAttached)
    {
        ExceptionHandler.Frob(ex);
    }
    else
    {
        throw;
    }
}

或者:

public static void Frob(Exception ex)
{
    if (Debugger.IsAttached)
    {
        Debugger.Break();
    }
}
b1payxdu

b1payxdu2#

我不做.net开发,但在java中,我通过向应用程序的启动选项传递一个标志来做到这一点。所以你可以从IDE向应用程序传递一个调试标志,然后检查,当应用程序作为可执行文件运行时,该标志不会出现。如果.net没有类似的东西,我会感到惊讶。

7bsow1i6

7bsow1i63#

我知道这是旧的,但提供的解决方案不是很令人满意。
我使用了下面的类:

using System.IO;
using System.Reflection;

public static class Program
{
    public static string ExecutablePath
    {
        get;
        private set;
    }

    static Program()
    {
        var assemblyPath = Assembly.GetEntryAssembly().Location;
        var assemblyDirectory = Path.GetDirectoryName(assemblyPath);

        if (assemblyDirectory.EndsWith(@"\Debug") || assemblyDirectory.EndsWith(@"\Release"))
        {
            string projectFile = Path.GetFileNameWithoutExtension(assemblyPath) + ".csproj";

            var root = new DirectoryInfo(assemblyDirectory);

            while (root.Parent != null)
            {
                if (File.Exists(Path.Combine(root.FullName, projectFile)))
                    break;

                root = root.Parent;

                if (root.Parent == null) // we could not find it (should not happen)
                    ExecutablePath = assemblyDirectory;
            }

            ExecutablePath = root.FullName;
        }
        else
        {
            ExecutablePath = assemblyDirectory;
        }
    }
}

如果你已经有了一个名为Program的类,你可以用这些属性和方法来扩展它。
如果从Visual Studio运行,它会给予你csproj文件所在的项目路径。这是一个没有“bin*\Debug”或“bin*\Release”的可执行路径。
如果不是从Visual Studio运行,它将为您提供可执行文件所在的路径。
该解决方案独立于调试设置,其他附加的调试器或构建配置。唯一重要的是,您的配置命名为“Release”和“Debug”。

**注意:**正如Troy Gizzi在评论中提到的,此解决方案仅适用于从输出目录以外的其他目录运行可执行文件的情况。对于我的用例(模拟以项目目录作为根目录的部署目录结构),这是一个合适的解决方案。通常,我稍后会将可执行文件复制到部署目录,并期望与从Visual Studio中运行程序时的行为相同。在我的用例中,内容和其他依赖项相对于项目目录定位。

mpbci0fu

mpbci0fu4#

你考虑过命令行参数吗?从Visual Studio运行程序时,要带一个--no-exception-handling标志(或任何听起来合适的标志),如果传入了这个参数,就不要处理异常。当你在其他地方启动程序时,没有这个参数,它会正常运行。

goucqfw6

goucqfw65#

我将添加一个启用报告功能的配置标志,而不是通过进程树进行跟踪。该标志可以始终默认为“true”,除非您在DEV环境中将其设置为“false”。

mzaanser

mzaanser6#

有时候应用程序是在调试器之外启动的,而调试器稍后会被附加。(双击应用程序被分配到的文件...)我使用这段代码来等待调试器附加。

using System.Diagnostics;

Process[] procName = Process.GetProcessesByName("devenv");

if(procName.Length > 0)
  MessageBox.Show("Wait for debugger attach");
cx6n0qe3

cx6n0qe37#

在VisualStudio 2022中以调试或发布模式运行应用程序时,会设置一些环境值。其中一个是“VisualStudioEdition”。
因此,我检测到我正在Visual Studio中运行,使用如下代码:

var isRunningInVS = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("VisualStudioEdition"));

相关问题