2012-01-16 4 views
0

私たちのアプリケーションでは、1日を通して指定された時間にデータを処理するために、バックグラウンドで実行する必要のある数多くのWindowsサービス(30以上)があります。私はBaseServiceクラスを作成しようとしていました。これは、サービスの開始時または停止時に、他の共通の機能と同様に、データベースに記録されたものを継承することができます。しかし、いくつかのMustOverrideプロパティがあるので、私はBaseServiceをMustInheritとして作成しようとしています。問題は次のようになります。Windowsサービスの基本クラスを作成する

<MTAThread()> Shared Sub Main() 

私たちのコードはすべてVBで書いてあります。共有メソッドであるため、オーバーライドすることはできません(つまり、MustOverrideにする)。このメソッドがなければ、コードはコンパイルされませんが、実際には基底クラスでは機能しません。このメソッドのコードは次のとおりです。それはMustInheritとして指定されているため

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

BaseService(私の基底クラスの名前)を作成することができません。そしてそこに私の問題があります。私はこれをベースクラスで作成することはできず、継承クラスでオーバーライドすることはできません。

+0

主なアプリケーションのではなく、サービスの方法であり、 1つのアプリケーションが複数のサービスをホストできるためです。アプリケーションとサービスを別々のクラスに分けることができます。これにより、タスクが容易になる場合があります。 –

答えて

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

関連する問題