Проявляется только на W7, на любых. Системы чистые (и реальные и под VM). Под 2003/XP проблема не повторяется.
Есть два проекта под .NET 2.0 — один реальный, второй тестовый (код ниже). Тестовый изначально был минимальным сервисом (дефолтный проект, созданный из под VS2008). В реальном проекте основную часть довёл до минимума в процессе тестов. Т.е. на данный момент он при запуске выполняет полностью то же самое, что и тестовый (хотя, судя по описанному ниже поведению, видимо нет). В реальном проекте используются классы из 'System.Net.Sockets' и 'System.Data.SqlClient'. Но вся инициализация, связанная с ними, для тестов была убрана и из Main и из OnStart.
Оба сервиса регистрируются на тестовой машине при помощи SC.
sc create <имя> binpath= <путь> type= own start= auto
Строка 'if (args.Length == 0)' в 'Main' добавлена в тестовых целях, что бы в случае запуска с параметром командной строки, экзешник отрабатывал в холостую.
Далее, у тестового сервиса наблюдается абсолютно нормальное поведение и при ручном запуске/остановке и при автоматическом старте при запуске системы и при холостом запуске с параметром командной строки.
У реального проекта симптомы мне не понятные:
1. Если в системе включена (не Disabled) служба "WinHttpAutoProxySvc", то если запустить экзешник сервиса любым способом (и как службу и в холостом режиме через командную строку), он зачем-то выполняет запуск указанной выше службы, что-то от неё ожидает, мучается секунд 20-30, потом успешно завершается (если в холостом режиме) или переходит в режим "работает" (если как служба).
2. Если служба 'WinHttpAutoProxySvc' в состоянии 'Disabled', то в обоих случаях запуск отрабатывает мгновенно.
3. При автозапуске при загрузке системы мой сервис не стартует вообще (независимо от наличия 'WinHttpAutoProxySvc'). В событиях системы появляется надпись "служба не ответила на запрос своевременно". Я пробовал ставить протоколирование на входе в 'Main' и 'OnStart', но эти участки почему-то не отрабатывают вообще.
Все статические объекты (коих мало и все мне известны) инициализируются только явно. Т.е. в коде нет участков типа 'static MyClass obj = new MyClass()', а любая работа из 'Main' и 'OnStart' убрана.
В какую сторону вообще смотреть? Проблема конечно обходимая, но неудобства создаёт на клиентских машинах.
P.S.: гуглил, Рихтера читал, ещё одну книгу по практике тоже, но причин оного поведения так и не смог понять.
static void Main(string[] args)
{
if (args.Length == 0)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new TestService() };
ServiceBase.Run(ServicesToRun);
}
}
public partial class TestService : ServiceBase
{
public TestService()
{
InitializeComponent();
}
protected override void OnStart(string[] args) { }
protected override void OnStop() { }
}