.NET (managed) 코드의 Windows Service에서 메소드가 호출되는지 알리는 방법

StackOverflow https://stackoverflow.com/questions/911921

  •  06-09-2019
  •  | 
  •  

문제

관리 코드로 작성하는 방법이 대화식 앱 대 Windows 서비스에서 호출되는지 어떻게 알 수 있습니까?

도움이 되었습니까?

해결책 2

나는 이것을 알아 냈을 것이라고 생각합니다 (적어도 이것은 내 필요에 대한 효과가 있습니다. 마일리지는 당신이하려는 일에 따라 다를 수 있습니다). "userinteractive"라는 환경 객체에 매달려있는 속성이 있습니다. 데스크탑에 액세스 할 수있는 컨텍스트에서 실행 중인지 여부를 알려줍니다.

다른 팁

Windows 서비스의 어떤 부분이 알고 싶은가? 또는 대화 형 앱의 어떤 부분에 대해 알고 싶지 않습니까? 실제로 당신에게 중요한 것은 무엇입니까?


이런 요청을들을 때마다 거의 항상 디자인의 실수입니다. 몇 가지 답변을 제안합니다.

  1. 발신자가 사용할 포맷터를 알려 주거나
  2. Formatter 클래스의 이름을 구성 파일로 배치하십시오. 모든 Formatter가 동일한 인터페이스를 구현하도록하십시오. 런타임에 처음으로 Formatter가 필요할 때 구성 파일에 지정된 인스턴스를 작성하고 공통 인터페이스를 통해 호출하십시오.
  3. 바퀴를 재발 명하지 마십시오. 실제로 내 #2와 유사하게 구성되는 System.Diagnostics의 클래스를 사용하십시오.

코드가 호출 된 컨텍스트에 민감한 것은 거의 항상 실수입니다.

이를 수행하는 방법에는 두 가지 이상이 있습니다.

  1. "system.reflection.assembly.getCallingAssembly (). FullName"은 코드를 호출하는 어셈블리의 이름을 반환합니다.
  2. "Environment.StackTrace"는 누가 코드를 호출하는 사람의 전체 스택 추적을 반환합니다. 문자열에 호출 메소드 이름이 표시되어야합니다.

두 개의 다른 로거를 정의 할 수 있습니다. 하나는 대화식 앱과 Windows 서비스 용으로는 하나입니다. 클라이언트가 구성 파일을 사용하여 사용하려는 로거를 선택하도록하십시오. 클라이언트가 잘못된 로거를 선택하거나 구성을 잊어 버린 경우 기본 로거를 가질 수도 있습니다. 로깅 및 서식 메시지와 같은 기능을 구성 할 수있는 기능을 갖는 것이 더 나은 아이디어라고 생각합니다.

가능성이 내장되어 있는지 모르지만 System.Diagnostics.Process 수업. 무엇보다도 a GetService() 방법, 아마도 도움이 될 것입니다. 그것이 실패하면, StartInfo 유용한 정보를 포함 할 수있는 회원.

Pinvoke를 사용하지 않으면 현재 프로세스의 상위 프로세스를 얻을 수 있습니다. 계정에서 실행중인 경우 NT Authority 시스템 그리고 그것은 이름입니다 service.exe, 현재 프로세스는 (대부분) 서비스입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top