솔루션 속성에서 하나의 유일한 프로젝트에 대해 구성을 “릴리스”로 설정했습니다.
메인 루틴의 시작 부분 에이 코드가 있으며 “Mode = Debug”가 표시됩니다. 또한 맨 위에 두 줄이 있습니다.
#define DEBUG
#define RELEASE
올바른 변수를 테스트하고 있습니까?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
내 목표는 디버그 모드와 릴리스 모드를 기반으로 변수에 다른 기본값을 설정하는 것입니다.
답변
DEBUG
/ _DEBUG
는 이미 VS에 정의되어 있어야합니다.
#define DEBUG
코드에서를 제거하십시오 . 해당 특정 빌드에 대한 빌드 구성에서 전처리기를 설정하십시오.
그것은 “모드 = 디버그”인쇄 이유 때문에 당신입니다 #define
다음 건너 뜁니다 elif
.
확인하는 올바른 방법은 다음과 같습니다.
#if DEBUG
Console.WriteLine("Mode=Debug");
#else
Console.WriteLine("Mode=Release");
#endif
확인하지 마십시오 RELEASE
.
답변
기본적으로 Visual Studio는 프로젝트가 디버그 모드로 컴파일 된 경우 DEBUG를 정의하고 릴리스 모드 인 경우에는 정의하지 않습니다. RELEASE는 기본적으로 릴리스 모드에서 정의되지 않습니다. 다음과 같이 사용하십시오 :
#if DEBUG
// debug stuff goes here
#else
// release stuff goes here
#endif
릴리스 모드에서만 무언가를 수행하려는 경우 :
#if !DEBUG
// release...
#endif
또한 특정 심볼이 정의 된 경우에만 [Conditional("DEBUG")]
반환 void
되도록 메소드에 속성을 사용할 수 있음을 지적하는 것이 좋습니다 . 심볼이 정의되지 않은 경우 컴파일러는 해당 메소드에 대한 모든 호출을 제거합니다.
[Conditional("DEBUG")]
void PrintLog() {
Console.WriteLine("Debug info");
}
void Test() {
PrintLog();
}
답변
#define
지시문 을 찾는 것보다 다음과 같이 확인하는 것이 좋습니다.
if (System.Diagnostics.Debugger.IsAttached)
{
//...
}
else
{
//...
}
물론 경고를 사용하면 디버그 모드에서 무언가를 컴파일하고 배포 할 수 있지만 여전히 디버거가 연결되어 있지 않습니다.
답변
특히 #if에 대한 열렬한 팬이 아닙니다. 특히 디버그 빌드는 통과하지만 문제가 없다면 릴리스 빌드는 실패하는 문제가 발생하기 때문에 코드베이스에 모두 퍼뜨릴 경우 특히 그렇습니다.
그래서 여기에 내가 생각해 낸 것이 있습니다 ( C #의 #ifdef에서 영감을 얻음 ).
public interface IDebuggingService
{
bool RunningInDebugMode();
}
public class DebuggingService : IDebuggingService
{
private bool debugging;
public bool RunningInDebugMode()
{
//#if DEBUG
//return true;
//#else
//return false;
//#endif
WellAreWe();
return debugging;
}
[Conditional("DEBUG")]
private void WellAreWe()
{
debugging = true;
}
}
답변
bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='
이 메소드 Debug.Assert
에는 조건부 속성이 DEBUG
있습니다. 정의되지 않은 경우 통화 및 할당 isDebug = true
이 제거됩니다 .
기호가 정의되면 통화가 포함됩니다. 그렇지 않으면 호출 (호출 매개 변수 평가 포함)이 생략됩니다.
경우 DEBUG
정의, isDebug
로 설정 true
(및 전달 Debug.Assert
이 경우에 아무것도 안하는).
답변
빌드 유형에 정의 된 변수를 사용하려는 경우 두 줄을 제거해야합니다.
#define DEBUG
#define RELEASE
… 이렇게하면 #if (DEBUG) 가 항상 참이됩니다.
또한 RELEASE에 대한 기본 조건부 컴파일 기호가 없습니다 . 프로젝트 속성으로 정의하려면 빌드 탭을 클릭 한 다음 일반 표제 아래의 조건부 컴파일 기호 텍스트 상자에 RELEASE를 추가하십시오 .
다른 옵션은 이것을하는 것입니다 …
#if DEBUG
Console.WriteLine("Debug");
#else
Console.WriteLine("Release");
#endif
답변
상단에서 당신의 정의를 제거
#if DEBUG
Console.WriteLine("Mode=Debug");
#else
Console.WriteLine("Mode=Release");
#endif