2009-06-11 1 views
4

C#의 신뢰할 수있는 오래된 선행 처리기 지시문은 다음과 같이 쓸 때 잘 작동하는 것처럼 보입니다.C#에서 조건부로 속성을 활성화하려면 어떻게합니까? "#if 디버그"가 작동하지 않습니다.

#if DEBUG 
... 
(Some code) 
... 
#endif 

그러나 조건부 블록으로 묶인 속성은 계속 처리되는 것처럼 보입니다. 예를 들어, 조건부 블록 내의 [AssemblyVersion(...)]를 둘러싸는 것은 영향을 미치지 않는 것으로 보입니다.

왜 우리는 [AssemblyVersion (..)]을 조건부로 무시할 것인지에 대한 자세한 내용을 알 수 있지만 관련이 없습니다. 어떤 아이디어?

+0

이 동작의 예를 보려면 두 개의 AssemblyVersion 특성을 정의하고 하나를 조건부 "#if 디버그"블록 안에 넣으십시오. –

+0

전 처리기 지시문이라고하고 C#에서는 실제로 컴파일러에서 처리합니다. – VVS

+0

"#if DEBUG"블록 안에 두 개의 AssemblyVersion 속성이 있으면 "# else"와 "#endif"사이에 다른 하나가 있기를 바랍니다. –

답변

1

나는 그것을 알아 냈다! 내가 언급하지 않았던 핵심 정보가있었습니다. 워크 플로 프로젝트였습니다 (Guid {14822709-B5A1-4724-98CA-57A101D1B079}). 워크 플로 프로젝트 유형, 특히 빌드 파일에 포함 된 Workflow.Targets 파일의 버그가있는 것으로 나타났습니다.

마치 전 처리기가 DEBUG 상수가 정의 된 것처럼 작동하는 것처럼 보입니다. 워크 플로 프로젝트를 생성하고 AssemblyInfo 파일에 추가하여이 문제를 재현 할 수 있습니다.

#if DEBUG 
[assembly: AssemblyFileVersion("1.0.0.0")] 
#endif 

그런 다음 릴리스 빌드를 사용해보십시오. MS : https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=466440

감사합니다. -Sean

+1

원본을 편집하고이 정보를 추가해야합니다. 기술적으로 이것은 질문이 잘못 묻기 때문에 정답이 아닙니다 :) – RKitson

0

릴리스 모드로 제작하지 않습니까?

+0

해제 모드입니다. 이 경우 릴리스 구성에서 "#if 디버그"내의 블록이 계속 처리됩니다. –

8

제대로 작동합니다. 내 AssemblyInfo.cs 파일에서, 나는 다음과 같습니다

#if DEBUG 
[assembly: AssemblyConfiguration("Debug")] 
#else 
[assembly: AssemblyConfiguration("Release")] 
#endif 

리플렉터에서 컴파일 된 어셈블리를 보면, 나는 올바른 속성을 참조하십시오.

속성에만 디버그 기호가 정의되어 있고 코드의 실제 #define DEBUG 명령으로 정의되어 있지 않아야합니다. 코드에서 직접 정의한 경우 전체 프로젝트가 아닌 해당 파일에 대해서만 적용됩니다. 프로젝트 특성에서 정의하면 전체 프로젝트에 적용됩니다.

+0

이것은 이상합니다. 간단한 콘솔 앱을 사용하면 제대로 작동합니다 (릴리즈 모드를 선택하면 #if 디버그 블록 내의 속성을 무시합니다!). 더 많은 연구를하고 있습니다 ... 해당 프로젝트는 클래스 라이브러리입니다. 이걸 알아 내면 ... –

+0

예를 들어서 예제 코드를 가져온 프로젝트는 클래스 라이브러리이기 때문에 동작에 영향을 미치지 않아야합니다. #if 디버그는 작동하지 않지만 #if 디버그는 대부분 잘못 정의 된 상황 때문에 발생합니다. 프로젝트 속성을 확인하고 #define 지시문이 없는지 확인하십시오. –

+0

@ScottDorman이 대신 [Conditional ("DEBUG")]를 사용하여이 작업을 수행 할 수 있습니까? –

0

간단 - 메타 데이터 태그 [조건]과 디버그 기능 (들)을 태그 할 수 있습니다

#define DEBUG1 

... 

public static void PrintText1(string txt) { 
    Console.Write("This is PrintText2\n"); 
} 

[Conditional("DEBUG1")] 
public static void PrintText2(string txt) { 
    Console.Write("This is PrintText2\n"); 
} 

[STAThread] 
static void Main(string[] args) { 
    PrintText1("This is the unconditional method"); 
    PrintText2("This function will be called only if 'DEBUG1' is defined"); 
} 

그것을 시도!

또한 내가 알기로는 #define은 정의 된 파일의 컨텍스트 내에 존재하며, 다른 파일에서 PrintText2를 호출하는 경우에는 디버그가 정의되지 않은 경우 실행되지 않습니다. 이것은 또한 주변의 다른 방법으로 작동합니다

[Conditional("DEBUG1")] 
public static void ConditionedPrint(string txt) { 
    Console.Write("This is PrintText2\n"); 
} 

public static void UnconditionedPrint(string txt)  { 
    ConditionedFunc(txt); 
} 

UnconditionedFunc 인쇄됩니다 #DEFINE의 DEBUG1이 파일을 정의 (의 경우에만) IFF에 관계없이 다른 파일의 "이것은 PrintText2 \ n은".

System.Diagnostics.Debug도 있는데, 나는 그것이 무엇을하는지 잘 모르겠습니다.

+0

속성을 받아들이지 만 속성 자체는 조건부 여야합니다. 간단한 프로젝트에서 작동하므로 프로젝트와 관련이 있습니다 .. 팁 주셔서 감사합니다! 그것은 깔끔하고 새로운 속성입니다. –

+0

오, 죄송합니다. 메타 데이터 태그가 필요하다는 사실을 알지 못했습니다. 내가 말할 수있는 것은 C#에서'#define'은 같은 파일의 문맥에서만 존재하기 때문에 그것이 원인 일 수 있다는 것입니다. VS는 컴파일되지 않을 라인을 표시해야하므로 원하는대로 작동 할 때 시각적 인 차이를 느껴야합니다. – Nefzen

+0

조건부 특성은 void 함수에서만 작동합니다. –

0

@yoyoyoyosef 코멘트 응답을 추적하려면 프로젝트의 속성 페이지를 확인해야합니다.

빌드 메뉴의 일반 제목 아래에 "정의 디버그 상수"확인란이 선택되어 있지 않은지 확인하십시오.

이 값은 빌드 메뉴의 맨 위에있는 "구성"선택 사항 (드롭 다운)에 따라 변경됩니다.

관련 문제