Обнаружение, если программа была запущена Visual Studio, в отличие от запуска из проводника Windows

Есть ли способ определить, была ли ваша программа загружена через Visual Studio по сравнению с ее запуском как автономным исполняемым файлом?

В нашем программном обеспечении есть функция уведомления об ошибках для обработки необработанных исключений - нам нужно иметь возможность распространять отладочные сборки для наших бета-тестеров, но мы не хотим, чтобы отчет об ошибках удалялся, когда мы находимся в середине разработки, потому что Исключения намного полезнее, если VS улавливает их с полной трассировкой стека и т.д.

Сейчас я отключу отчет об ошибке, если Application.ExecutablePath включает bin\Debug или bin\Release, но я считаю, что, вероятно, существует более надежный способ определения, была ли программа загружена через VS.

Очевидно, мы могли бы создать другую сборку с некоторыми макросами препроцессора, но, ради вопроса, предположим, что это не возможно - я не против добавления кода, но я пытаюсь сделать меньше всего изменений в процессе сборки, поэтому параметры командной строки также являются последним средством.

Если это имеет значение, я использую VS2003/.NET 1.1.

Ответы

Ответ 1

Если вы это сделаете, чтобы определить, находится ли он в любом отладчике (уточненном @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();
    }
}

Ответ 2

Вы считали аргументы командной строки? Запустите программу из Visual Studio с флагом -no-exception-handling (или любым другим звуком) и не обрабатывайте исключения, если этот аргумент передан. Когда вы запускаете программу в другом месте, без этого аргумента, это будет вести себя нормально.

Ответ 3

Я не занимаюсь разработкой .net, но в java я это сделал, передав флаг в параметры запуска приложения. Таким образом, вы можете передать флаг отладки в приложение из IDE, а затем проверить это, когда приложение запускается как исполняемый файл, флаг не будет присутствовать. Я был бы удивлен, если у .net не было чего-то подобного.

Ответ 4

Вместо отслеживания по дереву процессов я бы добавил флаг конфигурации, который позволяет использовать функцию отчетности. Флаг всегда может по умолчанию использовать значение "true", если вы не находитесь в вашей среде DEV, а затем установите значение "false".