像Ash一样,我将所有实际的处理代码编写在单独的类库程序集中,然后由Windows Service可执行文件以及控制台应用程序引用。
但是,有时候了解类库是否在服务可执行文件或控制台应用程序的上下文中运行很有用。我这样做的方法是反思托管应用程序的基类。(对VB表示抱歉,但是我认为可以很容易地对C#进行以下修饰):
Public Class ExecutionContext ''' <summary> ''' Gets a value indicating whether the application is a windows service. ''' </summary> ''' <value> ''' <c>true</c> if this instance is service; otherwise, <c>false</c>. ''' </value> Public Shared Readonly Property IsService() As Boolean Get ' Determining whether or not the host application is a service is ' an expensive operation (it uses reflection), so we cache the ' result of the first call to this method so that we don't have to ' recalculate it every call. ' If we have not already determined whether or not the application ' is running as a service... If IsNothing(_isService) Then ' Get details of the host assembly. Dim entryAssembly As Reflection.Assembly = Reflection.Assembly.GetEntryAssembly ' Get the method that was called to enter the host assembly. Dim entryPoint As System.Reflection.MethodInfo = entryAssembly.EntryPoint ' If the base type of the host assembly inherits from the ' "Servicebase" class, it must be a windows service. We store ' the result ready for the next caller of this method. _isService = (entryPoint.ReflectedType.baseType.FullName = "System.ServiceProcess.Servicebase") End If ' Return the cached result. Return CBool(_isService) End Get End Property Private Shared _isService As Nullable(Of Boolean) = Nothing#End RegionEnd Class
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)