Обнаружение, если программа была запущена 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".