Я мог бы успешно справиться (почти) с той же проблемой, что и вы, выполнив следующее:
В вашем Class: ServiceBase, который представляет ваш класс Service, у вас может быть:
public Class () //constructor, to create your log repository
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("YOURSource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"YOURSource", "YOURLog");
}
eventLog1.Source = "YOURSource";
eventLog1.Log = "YOURLog";
}
Теперь реализуйте:
protected override void OnStart(string[] args)
{...}
И
protected override void OnStop()
{...}
Для обработки вызовов пользовательских команд:
protected override void OnCustomCommand(int command)
{
switch (command)
{
case 128:
eventLog1.WriteEntry("Command " + command + " successfully called.");
break;
default:
break;
}
}
Теперь используйтеэто в приложении, где вы будете вызывать Службу Windows:
Enum для ссылки на ваши методы: (запомните, пользовательские методы Служб всегда получают int32 (от 128 до 255) в качестве параметров и, используя Enum, вы делаетепроще запоминать и контролировать свои методы
private enum YourMethods
{
methodX = 128
};
Чтобы вызвать определенный метод:
ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName);
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service
scp.Assert();
sc.Refresh();
sc.ExecuteCommand((int)YourMethods.methodX);
Делая это, вы можете контролировать свой сервис.
Здесь вы можете проверить, как создать и установить Службу Windows. Подробнее о методе ExecuteCommand.
Удачи!