public int Run() { var serviceTable = new ServiceTableEntry[2]; // second one is null/null to indicate termination serviceTable[0].serviceName = serviceName; serviceTable[0].serviceMainFunction = Marshal.GetFunctionPointerForDelegate(serviceMainFunctionDelegate); try { // StartServiceCtrlDispatcherW call returns when ServiceMainFunction has exited and all services have stopped // at least this is what's documented even though linked c++ sample has an additional stop event // to let the service main function dispatched to block until the service stops. if (!nativeInterop.StartServiceCtrlDispatcherW(serviceTable)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } } catch (DllNotFoundException dllException) { throw new PlatformNotSupportedException(nameof(Win32ServiceHost) + " is only supported on Windows with service management API set.", dllException); } if (resultException != null) { throw resultException; } return(resultCode); }
public Task <int> RunAsync() { var serviceTable = new ServiceTableEntry[2]; // second one is null/null to indicate termination serviceTable[0].serviceName = serviceName; serviceTable[0].serviceMainFunction = Marshal.GetFunctionPointerForDelegate(serviceMainFunctionDelegate); try { // StartServiceCtrlDispatcherW call returns when ServiceMainFunction exits if (!nativeInterop.StartServiceCtrlDispatcherW(serviceTable)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } } catch (DllNotFoundException dllException) { throw new PlatformNotSupportedException(nameof(Win32ServiceHost) + " is only supported on Windows with service management API set.", dllException); } return(stopTaskCompletionSource.Task); }