2013-10-15 107 views
1

我使用C#创建了Windows服务#& VS 2012 Express。成功安装服务后,当我尝试启动它时,我在Windows应用程序日志中收到以下错误:服务运行时无法更改服务名称。C#中的Windows服务无法启动

我想我的手在C#VB6的编码器(叫我疯了针对与业务开始)...

您输入将不胜感激。

这里是我的代码:

using System; 
using System.IO; 
using System.ComponentModel; 
using System.ServiceProcess; 
using System.Configuration.Install; 

public class KFolderWatcher : ServiceBase 
{ 
    public const string MyServiceName = "KFolderWatcher"; 
    private FileSystemWatcher watcher = null; 

    public KFolderWatcher() 
    { 
     this.ServiceName = "KFolderWatcher"; 
     this.CanStop = true; 
     this.CanPauseAndContinue = false; 
     this.AutoLog = true; 
    } 

    protected override void OnStart(string[] args) 
    { 
     this.ServiceName = MyServiceName; 

     // Create a new FileSystemWatcher with the path and jpg file filter 
     FileSystemWatcher watcher = new FileSystemWatcher("c:\\scans\\", "*.jpg"); 

     //Watch for changes in LastAccess and LastWrite times, and the renaming of   files or directories. 
     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); 

     // Begin watching. 
     watcher.EnableRaisingEvents = true; 
    } 

    protected override void OnStop() 
    { 
     watcher.EnableRaisingEvents = false; 
     watcher.Dispose(); 

     //LogEvent("Monitoring Stopped"); 
     Console.WriteLine("Monitoring Stopped"); 
    } 

    void OnRenamed(object sender, RenamedEventArgs e) 
    { 
     string log = string.Format("{0} | Renamed from {1}", e.FullPath, e.OldName); 
     //LogEvent(log); 
     Console.WriteLine(log); 
    } 

    public static void Main() 
    { 
     ServiceBase.Run(new KFolderWatcher()); 
    } 

    //This method is called when a file is created, changed, or deleted. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     //Show that a file has been created, changed, or deleted. 
     WatcherChangeTypes wct = e.ChangeType; 
     Console.WriteLine("File {0} {1}", e.FullPath, wct.ToString()); 
    } 

    protected void FileCreated(object sender, FileSystemEventArgs e) 
    { 
     if (e.ChangeType == WatcherChangeTypes.Created) 
     { 
      if (Directory.Exists(e.FullPath)) 
       Console.WriteLine("A new folder has been created."); 
      else 
       Console.WriteLine("A new file has been created."); 
     } 
    } 

} 

[RunInstaller(true)] 
public class KFolderWatcherInstaller : Installer 
{ 
    private ServiceProcessInstaller processInstaller; 
    private ServiceInstaller serviceInstaller; 

    public KFolderWatcherInstaller() 
    { 
     processInstaller = new ServiceProcessInstaller(); 
     serviceInstaller = new ServiceInstaller(); 
     processInstaller.Account = ServiceAccount.LocalSystem; 
     processInstaller.Username = null; 
     processInstaller.Password = null; 
     serviceInstaller.StartType = ServiceStartMode.Manual; 
     serviceInstaller.ServiceName = "KFolderWatcher"; 
     serviceInstaller.DisplayName = "Kempston Folder Watcher"; 
     serviceInstaller.Description = "Monitor Branch Folder for images to upload."; 
     Installers.Add(serviceInstaller); 
     Installers.Add(processInstaller); 
    } 
} 

回答

3

线

this.ServiceName = MyServiceName; 
在的OnStart()方法

引起问题。

+0

优秀!谢谢,我已经评论过这一行,并且它没有问题。 – robhob

+0

对我来说,它是在设计器类的InitializeComponent() –

3

请避免在分配服务类的服务名称。由于您已经创建了一个分配服务名称的安装程序,因此不需要将其写入服务中。

serviceInstaller.ServiceName = "KFolderWatcher"; 

public class KFolderWatcher : ServiceBase 
{ 
    //public const string MyServiceName = "KFolderWatcher"; 
    private FileSystemWatcher watcher = null; 

    public KFolderWatcher() 
    { 
     // this.ServiceName = "KFolderWatcher"; 
     this.CanStop = true; 
     this.CanPauseAndContinue = false; 
     this.AutoLog = true; 
    } 

    protected override void OnStart(string[] args) 
    { 
     // this.ServiceName = MyServiceName; 
..... 
+0

实际上在设计器中还有一个属性,您可以在其中更改服务名称。你应该使用这个,而不是在代码中做! –

+0

你是对的。 –

+0

谢谢,我正在快速版中执行此操作。是否支持按照您的建议更改设计师的姓名? – robhob