2014-12-01 3 views
2

Я делаю службу Windows в Visual Studio с помощью C#. Когда я запускаю программу из командной строки, она работает так, как ожидалось. Никакие исключения не могут быть выброшены или что-то в этом роде, и журнал событий будет записан как нормальный. Вот мой метод ввода.Служба Windows по-прежнему не работает при запуске в SCM

var service = new CSFolderWatcher(); 
if (Environment.UserInteractive) 
{ 
    service.CallStart(args); 
    Console.WriteLine("Press enter to stop program"); 
    Console.Read(); 
    service.CallStop(); 
} 
else 
{ 
    ServiceBase.Run(new ServiceBase[] { new CSFolderWatcher() }); 
} 

Однако, когда я иду в SCM, чтобы запустить службу, ящик сразу всплывает, что говорит: «Служба CS Folder Watcher на локальном компьютере запущена и затем остановлена. Некоторые службы автоматически останавливаются, если они не находятся в использование другими службами или программами ». Ничто не записывается в журнал событий вообще. Вот мой OnStart код:

internal void CallStart(string[] args) { OnStart(args); } 
internal void CallStop() { OnStop(); } 
protected override void OnStart(string[] args) 
{ 
    this.ServiceName = MyServiceName; 

    Properties.Settings.Default.Reload(); 
    this.destfolder = Properties.Settings.Default.DestinationFolder; 
    this.watchfolder = Properties.Settings.Default.WatchFolder; 
    this.watchfilter = Properties.Settings.Default.WatchFilter; 
    LogEvent(this.ServiceName + " starting" + "\r\n" + 
     "Destination folder: " + this.destfolder + "\r\n" + 
     "Watch Folder: " + this.watchfolder + "\r\n" + 
     "Watch Filter: " + this.watchfilter + "\r\n" + 
     "OnStart args: " + string.Join(", ", args)); 

    // Create a new FileSystemWatcher with the path 
    //and text file filter 
    try { watcher = new FileSystemWatcher(watchfolder, watchfilter); } 
    catch (Exception e) { LogEvent(e.ToString()); throw; } 

    watcher.IncludeSubdirectories = Properties.Settings.Default.WatchSubdirectories; 
    watcher.NotifyFilter = NotifyFilters.LastAccess 
         | NotifyFilters.LastWrite 
         | NotifyFilters.FileName 
         | NotifyFilters.DirectoryName; 

    // Add event handlers. 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.Created += new FileSystemEventHandler(OnChanged); 
    watcher.Deleted += new FileSystemEventHandler(OnChanged); 
    watcher.Renamed += new RenamedEventHandler(OnRenamed); 
    watcher.EnableRaisingEvents = true; 
} 

Вот код LogEvent:

private void LogEvent(string message) 
{ 
    string eventSource = MyServiceName; 
    DateTime dt = new DateTime(); 
    dt = System.DateTime.UtcNow; 
    message = dt.ToLocalTime() + ": " + message; 

    Console.WriteLine(message); 
    EventLog.WriteEntry(eventSource, message); 
} 
+0

'Properties.Settings.Default.DestinationFolder', что путь к папке он ищет на цель/погонный машину за пределами вашей локальной ..? вы уверены, что пути даже существуют так же, как и в вашей локальной среде .. также каковы права, которые имеет Служба на целевой машине ..? может ли это быть проблемой прав/разрешений ..? если бы это не было проблемой «Путь» ..? также, если это служба 'FileSystemWatcher', почему вы вызываете stop ..? не должен ли это работать всегда и иметь ручное вмешательство, чтобы остановить его.? – MethodMan

+0

CallStart и CallStop предназначены только для запуска с консоли, потому что я не мог напрямую обращаться к методам OnStart и OnStop. Так что да, это просто метод OnStop, который должен быть там. –

+0

Что вы подразумеваете под этим, это может быть проблема PATH? –

ответ

2

Проблема оказывается, что вы не можете установить свойство ServiceName от метода OnStart. this.ServiceName = MyServiceName; должен быть в конструкторе вместо этого, поскольку он кажется -, необходимый для его установки.

ServiceName идентифицирует услугу диспетчеру обслуживания. Значение этого свойства должно быть идентично имени, записанному для службы в свойстве ServiceInstaller.ServiceName соответствующего класса установщика. В коде ServiceName службы обычно устанавливается в функции main() исполняемого файла.

- MSDN Reference

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