디버그 구성 시에만 실행할 .NET 코드 필요
웹에서 API에 액세스하는 코드가 있습니다.API의 매개 변수 중 하나는 내가 테스트 중이라는 것을 그들에게 알릴 수 있습니다.
테스트할 때만 이 매개 변수를 내 코드에 설정하고 싶습니다.현재, 저는 릴리스 빌드를 할 때 코드를 주석으로 달 뿐입니다.
빌드 구성에 따라 자동으로 이 작업을 수행할 수 있는 방법이 있습니까?
솔루션
다음 중 하나를 사용할 수 있습니다.
1:Conditional
기여하다
특성은 지정된 조건부 컴파일 기호가 정의되지 않은 경우 메서드 호출 또는 특성을 무시해야 함을 컴파일러에 나타냅니다.
코드 예:
[Conditional("DEBUG")]
static void Method() { }
1b:Conditional
로컬 함수의 속성(C# 9)
C# 9부터는 로컬 함수에 속성을 사용할 수 있습니다.
코드 예:
static void Main(string[] args)
{
[Conditional("DEBUG")]
static void Method() { }
Method();
}
2:#if
전처리기 지시문
C# 컴파일러가 프리프로세서 지시어를 발견하고 그 다음에 #endif 지시어를 만나면 지정된 기호가 정의된 경우에만 지시어 사이의 코드를 컴파일합니다.C 및 C++와 달리 기호에 숫자 값을 할당할 수 없습니다.C#의 #if 문은 부울식이며 기호가 정의되었는지 여부만 테스트합니다.
코드 예:
#if DEBUG
static int testCounter = 0;
#endif
3:Debug.Write
방법들
Debug.Write
(및 )는 수신기 컬렉션의 추적 수신기에 디버그에 대한 정보를 기록합니다.
및 을 참조하십시오.
코드 예:
Debug.Write("Something to write in Output window.");
메모들
사용에 주의#if
비디버그(예: 릴리스) 빌드에서 의도하지 않은 상황을 발생시킬 수 있으므로 지시.예를 들어, 다음을 참조하십시오.
string sth = null;
#if DEBUG
sth = "oh, hi!";
#endif
Console.WriteLine(sth);
이 경우 디버그가 아닌 빌드는 빈 메시지를 인쇄합니다.하지만 이는 잠재적으로 발생할 수 있습니다.NullReferenceException
다른 경우에
더 읽기
- 에릭 리퍼트.조건부 컴파일과 조건부 속성의 차이점은 무엇입니까?
- C# 프로그래머 참고 자료: 조건부 방법 튜토리얼 (archive.org 미러)
- 빌 와그너.효과적인 C#: C#을 개선하는 50가지 구체적인 방법 (책), 장:#if 대신 조건부 특성 사용
- 존 로빈스..NET의 주장 및 추적(archive.org 미러)
- 샘 알렌.점이 아닌 점:
참고 항목
외부 응용 프로그램에서 디버그 정보를 캡처할 수 있는 DebugView 도구도 있습니다.
예, 코드를 랩으로 감습니다.
#if DEBUG
// do debug only stuff
#else
// do non DEBUG stuff
#endif
Studio는 Visual Studio를 으로 정의합니다.DEBUG
디버그 구성에 있는 경우.원하는 기호를 정의할 수 있습니다(프로젝트 속성, 빌드 탭 참조).전처리기 지시문을 남용하는 것은 좋지 않으며 코드를 읽고 유지하기가 매우 어려울 수 있습니다.
저도 이와 같은 문제가 있었고, 함께 사용한 솔루션은 다음과 같습니다.
if (System.Diagnostics.Debugger.IsAttached)
{
// Code here
}
이는 기술적으로 프로덕션에서 디버거를 연결하고 해당 코드를 실행할 수 있음을 의미합니다.
#if #endif 지시어 외에도 조건부 속성을 사용할 수 있습니다.속성으로 메서드를 표시하는 경우
[Conditional("Debug")]
응용프로그램이 디버그 모드로 빌드된 경우에만 컴파일되고 실행됩니다.아래 설명에서 언급한 것처럼 메소드에 void return 유형이 있을 때만 작동합니다.
여기 비슷한 결과를 가진 다른 게시물이 있습니다: 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
}
}
public int Method ()
{
#if DEBUG
// do something
#endif
}
다음은 안전하게 사용할 수 있는 항목입니다.
var isDebug = false;
#if DEBUG
isDebug = System.Diagnostics.Debugger.IsAttached;
#endif
if (isDebug) {
// Do something
}
이 기능은 asp.net 에서 작동합니다.
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
//send email to developer;
else
//send email to customer;
Rick Strahl @ 탐지-ASPNET-디버그 모드에서
언급URL : https://stackoverflow.com/questions/3409598/need-net-code-to-execute-only-when-in-debug-configuration
'programing' 카테고리의 다른 글
배열에서 값 찾기 (0) | 2023.06.03 |
---|---|
node.js 애플리케이션을 영구적으로 실행하는 방법은 무엇입니까? (0) | 2023.05.29 |
사용자 지정 특성의 생성자는 언제 실행됩니까? (0) | 2023.05.29 |
UI뷰 아래에 그림자를 그리려면 어떻게 해야 합니까? (0) | 2023.05.29 |
목록 이해를 사용하여 중첩된 목록을 처리하려면 어떻게 해야 합니까? (0) | 2023.05.29 |