2015-09-11 3 views
0

Как я могу поймать исключение, которое возникает при запуске службы Windows. Я не могу получить исключение здесь в моем нижнем коде, хотя я бросаю исключение в метод Onstart() службы.Невозможно уловить исключения ServiceController.Start() в вызывающем потоке

public class InterOpIntegrationWinService : ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     throw new InvalidOperationException(message); 
    } 
} 

телефонный код нить

try 
{ 
    using (ServiceController controller = new ServiceController()) 
    { 
     controller.ServiceName = objServiceConfig.ServiceName; 
     controller.Start(); 
     System.Windows.Forms.Application.DoEvents(); 
     //controller.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15)); 
     //controller.WaitForStatus(ServiceControllerStatus.Running); 
     //if (!string.IsNullOrEmpty(LogUtilities.ServiceOnStartException)) 
     //{ 
     // MessageBox.Show("Error with starting service : " + LogUtilities.ServiceOnStartException); 
     // LogUtilities.ServiceOnStartException = string.Empty; 
     //} 
    } 
} 
catch (System.InvalidOperationException InvOpExcep) 
{ 
    DisplayError(InvOpExcep.Message); 
    LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, InvOpExcep); 
    LogUtilities.ServiceOnStartException = string.Empty; 
} 
catch (Exception ex) 
{ 
    DisplayError(ex.Message); 
    LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, ex); 
    LogUtilities.ServiceOnStartException = string.Empty; 
} 

я проверить лицензию приложения в методе OnStart() и генерирует ошибку лицензирования, если это не удается. я хочу, чтобы это было доступно для моего вызывающего потока, чтобы я мог показать это сообщение в DialogBox. Любые идеи о том, как это сделать, если я не могу справиться с исключениями в моем вызывающем процессе.

+0

Откуда вы знаете, что не поймаете его? – dotctor

+0

После того, как controller.start(), он не входит в блок исключений, ни в исключении invalidOperationException, ни в блоке исключений – battech

+3

Исключения только «существуют» в рамках одного процесса - нет концепции улавливания исключений, которые происходят внутри других процессов - и запуск службы запускает новый процесс. –

ответ

2

Отделите свое обслуживание на (как минимум) два компонента - компонент, который имеет дело с IPC в той или иной форме (например, Remoting, конечная точка WCF, служба REST и т. Д.) И (один или несколько) компонентов, которые выполняют свою фактическую работу.

Если проверка лицензии не удалась, не запускайте другие компоненты, но все равно запустите компонент, предлагающий IPC. После запуска службы (которая должна всегда начинаться как минимум), приложение, основанное на форме, может подключиться к этой службе и (посредством любых средств, которые вы хотите) определить, что служба в настоящее время отказывается предоставить какую-либо функциональность из-за неудачной проверки лицензирования.

Смежные вопросы