2009-04-23 4 views
1

로그 할 대상과 기록 할 위치를 제어하는 ​​일부 조건부로 내 로거 클래스를 향상하려고합니다.조건부 메서드를 호출하는 조건부 메서드가 C#에서 작동하지 않습니다.

#define Logging 
#define VerboseLogging 

static void Main(string[] args) 
{ 
    Logger.Log("Logging", ""); 
    Logger.VerboseLog("VerboseLogging", ""); 
} 

는 "VerboseLogging을"없는 출력 만 "로깅", 산출 다음 프로그램을 실행, 그러나

public static class Logger 
{ 
    [Conditional("Logging"), Conditional("VerboseLogging")] 
    public static void Log(string msg, string filename) 
    { 
     // log to file 
    } 

    [Conditional("VerboseLogging")] 
    public static void VerboseLog(string msg, string filename) 
    { 
     Log(msg, filename); // just defer call to Log(string msg) 
    } 
} 

: 나는 로깅 기능 두 가지를 가지고있다.

응용 프로그램을 디버깅하면 VerboseLogging이 실제로 호출되지만 실제로는 Log(msg, filename)이 호출되지 않습니다. 디버거는 함수 호출 바로 위에 점프하여 VerboseLog() 함수의 끝으로 건너 뜁니다.

Log(string msg) 메서드에서 조건을 제거하면 작동합니다.

누구에게 이런 일이 발생했는지 또는 무엇을해야하는지에 대한 단서가 있습니까?

+0

나는 당신이 가지고있는 것과 똑같이 응용 프로그램을 만들었고 모든 것이 제대로 작동 했었습니다. 발생한 문제를 다시 만들 수 없습니다. –

+0

바이너리가 제대로 다시 작성되지 않았습니까? 깨끗한 구조를 만들려고 했습니까? –

+0

예, 이미 여러 번 시도했습니다. 물론 CSV를 읽고 파일에 로깅하는 등 내 응용 프로그램에 더 많은 것이 있습니다. VerbosLog (...)가 왜 호출되는지 이해할 수 없지만 VerboseLog()의 본문에서 Log() 호출을 건너 뜁니다. –

답변

3

참고이 없습니다.

프로젝트 전체 조건부 정의를 추가하려면 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 속성을 선택하십시오. 그런 다음 작성 탭으로 이동하여 "조건부 컴파일 기호"텍스트 상자에 "로깅, VerboseLogging"을 입력하십시오.

+0

그게 다야! 고맙습니다. –

0

조건이 거꾸로되어 있지 않습니까? 즉

[Conditional("Logging")] 
public static void Log(string msg, string filename) { } 

[Conditional("Logging"), Conditional("VerboseLogging")] 
public static void VerboseLog(string msg, string filename) { 
    Log(msg, filename); // just defers call to Log() 
} 
+0

아니, 나는 그렇게 생각하지 않는다. OP는 Log가 두 상황 모두에서 발생하기를 원하지만 VerboseLog는 VerboseLogging 조건에서만 발생합니다. –

+0

관계없이 VerboseLogging과 Logging이 모두 정의되어 있습니다. –

+0

Jeff Yates가 옳습니다. VerboseLogging이 정의 된 경우에만 VerboseLog가 기록됩니다. –

0

정말 도움이되지 않지만 게시 한 코드는 나에게 잘 작동합니다 (.NET 3.5 SP1 콘솔 응용 프로그램). 물론 main에서의 호출이 그것을 제공하지 않기 때문에 filename 매개 변수를 제거해야합니다. 그러나 둘 다 나에게 로그를 제공하고 자세한 정보를 지우면 로그 된 "로깅"만을 정의합니다. 문제에 오캄의 면도날을 적용

: 당신은 분명 게시 된 코드가 소스에서 직접되지 않기 때문에 (로그 방법 및 누락 된 매개 변수의 시체는) 당신에게 당신이 올바르게 정의의 철자 확인을하지 않습니다 당신의 원래 소스? 다른 것보다 내가 당신을 위해 작동하지 않는 이유를 아무 생각 ... 당신이 VerboseLog이 정의되지 않은 LogLogging 경우 호출하지 않기 때문에, 또한 Logger 파일에 LoggingVerboseLogging를 정의 할 필요가

+0

코드를 테스트 해 주셔서 감사합니다! "VerboseLogging"을 복사 했는데도 여전히 작동하지 않습니다.이상하게도 VerboseLog() - 메서드가 호출되지만 DoS()가 호출되지 않습니다. 그것 위로 점프. –

+1

아, 이제 진짜 답이 게시되었습니다. 모서리 절단과 모든 클래스를 단일 소스 파일에 넣는 것이이 문제를 테스트하는 가장 지능적인 방법이 아니 었습니다. 라이브와 나는 추측을 배웁니다 ... –