Нужно, чтобы код .NET выполнялся только в конфигурации отладки
У меня есть код для доступа к API в Интернете. Один из параметров API позволяет мне сообщить, что я тестирую.
Я хотел бы установить этот параметр только в моем коде при тестировании. В настоящее время я просто комментирую код, когда делаю сборку релиза.
Есть ли автоматический способ сделать это на основе конфигурации сборки?
Ответы
Ответ 1
1: Вы можете использовать атрибут Conditional
:
[Conditional("DEBUG")]
static void Method() { }
2: #if
препроцессорная директива:
#if DEBUG
static int testCounter = 0;
#endif
3: Или Debug.Write
\Debug.WriteLine
метод:
Debug.Write("Something to write in Output window.");
Остерегайтесь использования директивы #if
, поскольку она может привести к непредвиденным ситуациям в сборке Release. Например, см.
string sth = null;
#if DEBUG
sth = "oh, hi!";
#endif
Console.WriteLine(sth);
В этом случае сборка без отладки напечатает пустое сообщение.
Подробнее:
Существует также инструмент DebugView, который позволяет захватывать отладочную информацию из внешних приложений.
Ответ 2
да, оберните код в
#if DEBUG
// do debug only stuff
#else
// do non DEBUG stuff
#endif
Google для "Символы компиляции С#"
Visual Studio автоматически определяет DEBUG
, когда вы находитесь в конфигурации отладки. Вы можете определить любые символы, которые вы хотите (посмотрите на свои свойства проекта, вкладку сборки). Помните, что злоупотребление препроцессорными директивами - плохая идея, это может привести к тому, что код очень трудно читать/поддерживать.
Ответ 3
У меня была такая же проблема, и решение, с которым я пошел, использует:
if (System.Diagnostics.Debugger.IsAttached)
{
// Code here
}
Это означает, что технически в производстве вы можете прикрепить отладчик и запустить этот фрагмент кода.
Ответ 4
В дополнение к директивам #if #endif вы также можете использовать условные атрибуты. Если вы отметите метод с атрибутом
[Conditional("Debug")]
Он будет только компилироваться и запускаться, когда ваше приложение будет построено в режиме отладки. Как было отмечено в комментарии ниже, они работают только тогда, когда метод имеет тип возврата void.
Ответ 5
public int Method ()
{
#if DEBUG
// do something
#endif
}
Ответ 6
Вот еще одно сообщение с аналогичным результатом: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/
Лучшее объяснение можно увидеть по адресу: http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx
// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !MYTEST)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
Console.WriteLine("DEBUG and MYTEST are defined");
#else
Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
}
}
Ответ 7
Следующее можно безопасно использовать:
var isDebug = false;
#if DEBUG
isDebug = System.Diagnostics.Debugger.IsAttached;
#endif
if (isDebug) {
// Do something
}
Ответ 8
Это работает в asp.net:
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
//send email to developer;
else
//send email to customer;
от Rick Strahl @Detecting-ASPNET-Debug-mode