2012-01-16 2 views
0

우리는 하루 종일 주어진 시간에 데이터를 처리하기 위해 백그라운드에서 실행해야하는 많은 Windows 서비스 (30 개 이상)를 보유하고 있습니다. BaseService 클래스를 만들려고했는데, 서비스를 시작하거나 중지 할 때 데이터베이스에 기록 할 수있는 상속 클래스와 다른 일반적인 기능을 상속합니다. 그러나 MustInherit 속성을 가지고 있기 때문에 MustInherit으로 BaseService를 만들려고 애 쓰고 있습니다. 문제는 다음과 같습니다.Windows 서비스 용 기본 클래스 만들기

<MTAThread()> Shared Sub Main() 

Google 코드는 모두 VB에서 제공됩니다. 그것이 공유 메서드라는 것을 감안할 때 재정의 할 수 없습니다 (즉, MustOverride로 만들 수 없습니다). 이 메서드가 없으면 코드는 컴파일되지 않지만 기본 클래스에서는 실제로 작동하지 않습니다. 이 방법의 코드는 다음과 같습니다이 경우 MustInherit로 지정되어 있기 때문에

Dim ServicesToRun() As System.ServiceProcess.ServiceBase 
ServicesToRun = New System.ServiceProcess.ServiceBase() {New BaseService} 
System.ServiceProcess.ServiceBase.Run(ServicesToRun) 

BaseService (내 기본 클래스의 이름을) 만들 수 없습니다. 그리고 거기에 내 문제가있다. 이 클래스를 기본 클래스에서 만들 수 없으며 상속하는 클래스에서 재정의 할 수 없습니다.

+0

홈페이지가 아닌 서비스의 응용 프로그램의 방법은, 한 응용 프로그램이 여러 서비스를 호스트 할 수 있기 때문입니다. 응용 프로그램과 서비스를 서로 다른 클래스로 분리하면 작업을 쉽게 수행 할 수 있습니다. –

답변

0

다음은이 정확한 문제를 해결 한 방법입니다. 구현 유형을 기본 서비스 클래스의 공유 MainBase에 전달한 다음 구현 클래스에서 이것을 호출합니다.

여기 기본 서비스 클래스에서 코드입니다 :

' The main entry point for the process 
<MTAThread()> _ 
Shared Sub MainBase(ByVal ImplementingType As System.Type) 
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase 

    If InStr(Environment.CommandLine, "StartAsProcess", CompareMethod.Text) <> 0 Then 
     DirectCast(Activator.CreateInstance(ImplementingType), ServerMonitorServiceBase).OnStart(Nothing) 
    Else 
     ServicesToRun = New System.ServiceProcess.ServiceBase() {DirectCast(Activator.CreateInstance(ImplementingType), ServiceBase)} 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun) 
    End If 

End Sub 

그리고 여기에 구현 클래스의 코드입니다 :

' The main entry point for the process. The main method can't be inherited, so 
' implement this workaround 
<MTAThread(), LoaderOptimization(LoaderOptimization.MultiDomain)> _ 
Shared Sub Main() 

    Call MainBase(GetType(ThisImplementedService)) 
End Sub 
+0

고맙습니다. 그게 효과가있는 것처럼 보입니다. – GreenEggsAndHam

관련 문제