Подтвердить что ты не робот

Нужно, чтобы код .NET выполнялся только в конфигурации отладки

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

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

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

4b9b3361

Ответ 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