Je suis en train d'écrire un peu de code d'amorçage pour un service qui peut être exécuté dans la console. Il se résume essentiellement à l'appel de la OnStart() la méthode au lieu d'utiliser le ServiceBase pour démarrer et arrêter le service (car il ne veut pas exécuter l'application si elle n'est pas installé comme un service et permet de déboguer un cauchemar).
Droit maintenant, je suis en utilisant le Débogueur.Les isattached à déterminer si je dois utiliser la ServiceBase.Exécuter ou [service].OnStart, mais je sais que ce n'est pas la meilleure idée, parce que, à certains moments, les utilisateurs finaux souhaitez exécuter le service dans une console (voir la sortie etc. en temps réel).
Des idées sur comment je pourrais déterminer si le service Windows contrôleur de démarrage "moi", ou si l'utilisateur a commencé à " moi " dans la console? Apparemment, L'Environnement.IsUserInteractive n'est pas la réponse. J'ai pensé à utiliser la ligne de commande args, mais qui paraît "sale".
J'ai toujours pu voir sur une instruction try-catch autour de ServiceBase.Exécuter, mais qui semble sale. Edit: Essayez de capture ne fonctionne pas.
J'ai une solution: mettre en place ici pour tous les autres intéressés gerbeurs:
public void Run()
{
if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
{
RunAllServices();
}
else
{
try
{
string temp = Console.Title;
ServiceBase.Run((ServiceBase[])ComponentsToRun);
}
catch
{
RunAllServices();
}
}
} // void Run
private void RunAllServices()
{
foreach (ConsoleService component in ComponentsToRun)
{
component.Start();
}
WaitForCTRLC();
foreach (ConsoleService component in ComponentsToRun)
{
component.Stop();
}
}
EDIT: Il y a une autre question sur StackOverflow où le gars avait des problèmes avec l'Environnement.CurrentDirectory être "C:\Windows\System32" on dirait que peut être la réponse. Je vais le tester aujourd'hui.