2008-10-07 2 views
3

.Net DLL에서 Windows GUI 응용 프로그램 또는 웹 서비스에서 실행 중인지 여부를 어떻게 결정합니까? 나는 두 개의 응용 프로그램 사이에서 공유되는 낮은 수준의 클래스를 가지고 있으며 웹 서비스에서 사용될 때 메시지 상자를 비활성화해야합니다..Net DLL이 GUI 응용 프로그램 또는 웹 서비스에서 사용되는지 여부를 결정하는 방법은 무엇입니까?

Windows 응용 프로그램에는 200 가지가 넘는 솔루션이 있으며 기존 코드를 다시 고려할 수있는 위치에 있지 않습니다. 웹 서비스는 일부 기능을 재사용해야하며 빠른 해결책을 찾고 있습니다.

답변

4

웹 컨텍스트에서 실행중인 경우 HttpContext.Current는 null이 아닙니다.

+0

그게 내가 몇 가지 애플 리케이션을 위해 무엇을했는지, 그리고 그것은 잘 동작했습니다. – Larry

5

일반적인 조언 만하면 저급 클래스는 메시지 상자 자체를 사용하지 않아야하지만 메시지 상자를 원할 수도있는 경우를 처리 할 수있는 중간 인터페이스를 허용해야합니다.

이렇게했다면 웹에 대한 상위 수준의 클래스를 데스크톱에 사용하기 만하면됩니다. 각 클래스는 해당 컨텍스트에 적합한 알림 기능을 갖습니다.

+1

답변입니다. 라이브러리 클래스의 모든 메시지 박스 사용을 리팩토링하십시오. 결과를 해석하고 사용자에게 알리는 것은 발신자의 책임입니다. – Will

0

이 방법이 효과가 있는지는 잘 모르겠지만 잘 모르겠습니다. 다음 Win32 호출을 사용하십시오 :

GetModuleFileNameEx dll의 exe를 가져 와서 나중에 비교할 수 있도록 저장하십시오.
EnumWindows는 모든 최상위 창을 가져옵니다.
GetWindowModuleFileName은 EnumWindows의 창 핸들을 모듈 이름으로 변환합니다.

GetWindowModuleFileName 결과에서 고유 한 exe 파일을 찾을 수 있으면 dll은 GUI 응용 프로그램에서 실행됩니다.

3

Environment.UserInteractive 속성을 사용할 수 있습니다.

UserInteractive 속성은 Windows 프로세스 또는 사용자 인터페이스없이 실행 IIS와 같은 서비스에 대한 거짓 보고합니다. 이 속성이 false 인 경우 사용자와 상호 작용할 수있는 그래픽 사용자 인터페이스가 이므로 모달 대화 상자 또는 메시지 상자를 표시하지 마십시오.

나는 이것을 할 수 없다는 것을 알고 있지만 .... 또한 응용 프로그램 디자인에 대해 생각하고 싶을 수도 있습니다.

+0

Nice tip, thanks :) – leppie

+0

그러나이 Environment.UserInteractive는 "디스플레이와 연결된"모든 응용 프로그램에 적용됩니다. 여기에는 콘솔 응용 프로그램 (물론 메시지 상자도 표시 할 수 있지만 원하지 않을 수도 있습니다)이 포함됩니다. –

+0

또한이 경우 HttpContext.Current는 null이됩니다. – GvS

관련 문제