private void ServiceMainFunction(int numArgs, IntPtr argPtrPtr) { var startupArguments = ParseArguments(numArgs, argPtrPtr); serviceStatusHandle = nativeInterop.RegisterServiceCtrlHandlerExW(serviceName, serviceControlHandlerDelegate, IntPtr.Zero); if (serviceStatusHandle.IsInvalid) { stopTaskCompletionSource.SetException(new Win32Exception(Marshal.GetLastWin32Error())); return; } ReportServiceStatus(ServiceState.StartPening, ServiceAcceptedControlCommandsFlags.None, win32ExitCode: 0, waitHint: 3000); try { stateMachine.OnStart(startupArguments, ReportServiceStatus); } catch { ReportServiceStatus(ServiceState.Stopped, ServiceAcceptedControlCommandsFlags.None, win32ExitCode: -1, waitHint: 0); } }
private static extern bool SetServiceStatus(ServiceStatusHandle statusHandle, ref ServiceStatus pServiceStatus);
bool INativeInterop.SetServiceStatus(ServiceStatusHandle statusHandle, ref ServiceStatus pServiceStatus) { return(SetServiceStatus(statusHandle, ref pServiceStatus)); }