Я вызываю следующее из статического основного метода моей точки входа:
try { ServiceBase.Run(new MonitorSer()); }
catch (Exception ex) { Console.WriteLine(ex.Message + Process.GetCurrentProcess().MainModule.FileName); }
MonitorSer является экземпляром:
class MonitorSer : ServiceBase {
и метод main входа является членом моего класса:
[RunInstaller(true)]
public class WindowsServiceInstaller : Installer {
У меня были хорошие результаты, ловя исключения для отладки, но иногда они, кажется, находят свой путь в моих ловушках, как в этом случае.
У меня вспыхивает окно с сообщением, что мне нужно установить с помощью installutil, когда я действительно хочу найти имя этого процесса и вызвать его снова с ключом -i, который я подключил, чтобы он сам установился (благодарность тем, кто внес / переработал этот код).
Что делает это более расстраивающим, так это то, что если я установлю точки останова до (или включу) вызова ServiceBase.Run, он молча завершится неудачей, и я останусь с мигающей консолью.
UPDATE
static void Install(bool undo, string[] args)
{
try
{
Console.WriteLine(undo ? "uninstalling" : "installing");
using (AssemblyInstaller inst = new AssemblyInstaller(typeof(MonitorSer).Assembly, args))
{
IDictionary state = new Hashtable();
inst.UseNewContext = true;
try
{
if (undo) inst.Uninstall(state);
else
{
inst.Install(state);
inst.Commit(state);
}
}
catch
{
try
{
inst.Rollback(state);
}
catch { }
throw;
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
Я выбрал здесь точку входа, чтобы я мог вызвать вышеупомянутую функцию, я попробую переместить ее в другой класс и установить там точку входа, но я знаю, что могу сделать эту точку входа (которую вы, Дмитрий, отрицаете) работать, вызывая себя с соответствующим аргументом для установки - что может сделать только класс BaseService - исправьте меня, если я ошибаюсь.