Нужен код .NET для выполнения только при настройке отладки

У меня есть код для доступа к API в сети. Один из параметров API позволяет мне сообщить им, что я тестирую.

Я хотел бы установить этот параметр в своем коде только во время тестирования. В настоящее время я просто комментирую код, когда делаю сборку релиза.

Существует ли автоматический способ сделать это на основе конфигурации сборки?

34
задан Dariusz Woźniak 22 November 2013 в 20:18
поделиться

6 ответов

Решения

Вы можете использовать одно из следующих:

1 : Условный атрибут

Атрибут Условный указывает компиляторам, что вызов метода или атрибут следует игнорировать, если не определен указанный символ условной компиляции.

Пример кода:

[Conditional("DEBUG")]
static void Method() { } 

2: #if директива препроцессора

Когда компилятор C # встречает директиву препроцессора #if , за которой в конечном итоге следует #endif директива, она компилирует код между директивами, только если заданный символ определен. В отличие от C и C ++, вы не можете присвоить символу числовое значение. Оператор #if в C # является логическим и только проверяет, определен ли символ или нет.

Пример кода:

#if DEBUG
    static int testCounter = 0;
#endif 

3: Методы Debug.Write

Debug.Write Debug.WriteLine ) записывают информацию об отладке в трассировку. слушателей в коллекции Listeners .

См. Также Debug.WriteIf и Debug.WriteLineIf .

Пример кода:

Debug.Write("Something to write in Output window.");

Примечания

Остерегайтесь использования директивы #if , поскольку она может привести к непредвиденным ситуациям в сборке Release. Например, см .:

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);

В этом случае сборка без отладки выведет пустое сообщение. Но это потенциально может вызвать NullReferenceException в другом случае.

Подробнее

См. Также

Также имеется инструмент DebugView , который позволяет захватывать отладочную информацию из внешних приложений.

92
ответ дан 27 November 2019 в 15:51
поделиться

да, заключите код в

#if DEBUG
// do debug only stuff 
#else
// do non DEBUG stuff
#endif

Google для «символы компиляции C #»

Visual Studio автоматически определяет DEBUG , когда вы находитесь в конфигурации отладки. Вы можете определить любые символы, которые хотите (посмотрите свойства вашего проекта, вкладку сборки). Помните, что злоупотребление директивами препроцессора - плохая идея, это может привести к коду, который очень трудно читать / поддерживать.

31
ответ дан 27 November 2019 в 15:51
поделиться

У меня было такое же Проблема и решение, которое я выбрал, заключается в использовании:

if (System.Diagnostics.Debugger.IsAttached)
{
    // Code here
}

Это означает, что технически в производстве вы можете подключить отладчик и запустить этот фрагмент кода.

14
ответ дан 27 November 2019 в 15:51
поделиться

В дополнение к директивам #if #endif вы также можете использовать условные атрибуты. Если вы пометите метод атрибутом

[Conditional("Debug")]

Он будет скомпилирован и запущен только тогда, когда ваше приложение собрано в режиме отладки. Как было отмечено в комментарии ниже, они работают только в том случае, если метод имеет тип возврата void.

7
ответ дан 27 November 2019 в 15:51
поделиться

Вот другой пост с похожим результатом : 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
    }
}
3
ответ дан 27 November 2019 в 15:51
поделиться
public int Method ()
{
#if DEBUG 
   // do something 
#endif
}
2
ответ дан 27 November 2019 в 15:51
поделиться