2009-04-13 6 views
16

콘솔 응용 프로그램 또는 Windows 응용 프로그램에서 호출되는 경우 코드 라이브러리가 자동으로 검색하도록하는 간단한 방법이 있습니까? 내 라이브러리가 콘솔 창에서 호출되는 경우 Windows 이벤트 로그에보고하지 말고 대신 콘솔 창에보고하십시오. 그러나 콘솔 창에서 실행되지 않으면 Windows 이벤트 로그에보고해야합니다.콘솔에서 실행 중인지 어떻게 감지합니까?

로깅 구성 요소에 로그 대상이 전달되어야한다고 생각했지만 기본적으로이 두 대상을 기본적으로 자동으로 처리 할 수 ​​있으면 멋질 것입니다. 아직 log4net만큼 광범위한 것을 요구하지는 않습니다. 실제로 데이터베이스/파일 및 기타 알 수없는 로깅 대상에 대한 로깅을 지원해야하는 경우 그런 솔루션을 권장 할 수 있습니다. 지금은 내 구성 요소가 환경을 자동 감지하고 환경에 따라 콘솔이나 이벤트 로그에 로그하는 것만으로도 충분합니다.

답변

8

구조적으로 로깅 컨텍스트를 라이브러리 구성 요소로 전달하는 것이 올바른 선택입니다. 라이브러리는 실행되는 환경에 관한 많은 컨텍스트를 알지 못합니다.

이 두 가지 특수한 경우를 라이브러리 내에서 기본적으로 지원하기를 원하기 때문에 통합 접근 방식을 제안합니다.

  1. 호출자가 제어하는 ​​좀 더 일반적인 로깅 엔트리 포인트/노브를 작성하십시오.
  2. 자동으로 지원하려는 경우에 대해 일반화 된 항목을 자동으로 설정하는 별도의 진입 점/노브를 만듭니다.

심지어 설명에 따르면 너무 복잡해 보입니다. Diagnostics 컬렉션에서 해당 TraceListener를 사용하기 만하면 콘솔 응용 프로그램이 적절한 TraceListener를 추가하여 콘솔에 출력하고 비 콘솔 응용 프로그램이 적절한 EventLog TraceListener를 추가하여 Windows 이벤트 로그로 출력합니다. 이것은 외부 종속성 (예 : log4net)을 가정하지 않고 내장 된 모든 .net 로깅 지원에서 잘 작동하는 장점이 있습니다.

+0

솔직히 말하면, 지금까지 로깅하는 방법에 대해 많은 실험을 해본 적이 없습니다. 사실, 나는 몇 가지 사전 결정된 장소 중 하나에 로그인해야했습니다. 따라서 나는 TraceListeners를 실험 해본 적이 없다. 곧 바뀔 것이다. 고마워, +1 – BenAlabaster

+0

좋은 거래, 다행스럽게 도울 수있어! TraceListener 규칙입니다. : D –

1

이 질문에 변종이 이전에 요청되었습니다. 즉 herehere입니다.

' 솔루션은 당신을 호출 무엇 알아 내기 위해 반사를 사용하여 두 가지 옵션

  • 졸이다 것 같다.
  • 콘솔 응용 프로그램의 경우 try-catch 블록에서 console을 호출하고 실패했는지 또는 이 성공했는지 확인합니다.

내 개인적인 권장 사항은 라이브러리에서 인터페이스를 내보내는 것입니다. 인터페이스에는 호출자의 유형을 반환하는 함수 또는 속성이 있습니다. 호출 객체에는 인터페이스를 구현하는 클래스가 있으며이 인터페이스는 어떤 유형인지 반환합니다. 복잡성이 염려되기 때문에 인터페이스에서 배치 한 내용으로 복잡성을 어느 정도 제어 할 수 있습니다.

응용 프로그램이 라이브러리에 자신을 등록하지 않으면 오류가 발생하거나 자동 검색 구성을 시도해 볼 수 있습니다.

인터페이스를 사용하고 오류를 던짐으로써 프로그래머가 라이브러리를 정확히 사용하도록 명시하고 있습니다. 이 둘 사이의 상호 작용은 인터페이스에 의해 정의됩니다.

또한 상호 작용은 자동 스키마보다 융통성이 있습니다. 왜냐하면 사용자로서, 내 전화하는 바이너리가 신비한 규칙 집합이 아닌 라이브러리와 상호 작용하는 방식을 선택하기 때문입니다.

0

나도 알아, 콘솔이 없으면 Console.Read를 호출하면 예외가 발생합니다.

bool isConsole = true; 
try 
{ 
    isconsole = Console.CursorLeft >= int.MinValue; 
} 
catch(IOException) 
{ 
    // Try to attach to parent process's console window 
    isConsole = AttachConsole(0xFFFFFFFF); 
} 

... 

[DllImport("kernel32", SetLastError = true)] 
private static extern bool AttachConsole(uint dwProcessId); 

이것은 부작용이므로 신뢰할 수있는 감지 방법이 아니지만 지금은 효과가 있습니다.

+1

사용자가 실행하기 전에 가비지 문자를 입력해야 할 필요가 있습니까? 다른 정적 콘솔 방법이 사용자 상호 작용없이 같은 영향을 미치지 않을지 궁금합니다. –

6

"Console.Title"은 Windows 응용 프로그램에서 빈 문자열이되며 콘솔 응용 프로그램에 자동으로 설정된다는 것을 알게되었습니다.

아직도 해킹.

관련 문제