看不到Windows服务已安装

时间:2013-09-03 12:44:20

标签: c# windows-services

我创建了一个超级简单的Windows服务程序。我选择了项目项目 - > Windows服务,之后我将this.ServiceName = "servicename1";更改为`this.ServiceName = "ABC Test Service";

之后我创建了一个安装项目,将主输出设置为Windows服务。编译并安装它。

但是服务UI下看不到服务,我无法弄清楚为什么它不可见。这个解决方案就像我可以想象的那样直接开箱即用。我没有对代码做任何重要的事情。然而,我遗漏了一些东西,以便能看到已安装的服务。

我添加了哪些主要内容,这不是初始项目的一部分 - 我在OnStart(string[] args) / OnStop()中添加了一些内容。虽然我不会称它为专业。

我是否改变了初始项目的一部分。 - 我已经重命名了部分类

public partial class ABCTestService : ServiceBase  
{  
    public ABCTestService()  
    {  
        InitializeComponent();  
    }

    protected override void OnStart(string[] args)
    {
        Console.WriteLine("Service Start");
    }

    protected override void OnStop()
    {
        Console.WriteLine("Service Stop");
    }
}

在更改分部类的名称之前,该服务也是不可见的。安装过程没有任何警告或任何类型的错误。因此必须安装服务,因此它应该是可见的。

using System.ServiceProcess;

namespace WindowsService1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new ABCTestService() 
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

现在说ABCTestService(),确实说Service1()。在我更改部分类的名称之前,VS2010全部更改了名称。

2 个答案:

答案 0 :(得分:2)

这对我有用

安装:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil C:\MySampleService\bin\Debug\MyService.exe

卸载:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil /u C:\MySampleService\bin\Debug\MyService.exe

使用可在启动服务时从命令行指定的参数安装服务的方法也较短。两者基本上都执行相同的任务。请注意,第一种方法将记录进度和详细信息,而我将其从“快捷方式”解决方案中删除。

static void Main(string[] args)
    {
        if (Environment.UserInteractive)
        {
            string parameter = string.Concat(args);

            switch (parameter)
            {
                case "--install":

                    ManagedInstallerClass.InstallHelper(new[] { Assembly.GetExecutingAssembly().Location });

                    break;
                case "--uninstall":

                    ManagedInstallerClass.InstallHelper(new[] { "/u", Assembly.GetExecutingAssembly().Location });

                    break;
            }
        }

我的OnStart方法只执行我希望的代码

protected override void OnStart(string[] args)
    {
        //MyCode
    }

另外,我发现将我的服务编写为控制台应用程序以便于开发和调试是有益的。完成此操作后,只需通过创建安装程序并按上面列出的方式运行它即可将其转换为服务。另请注意if(Environment.UserInteractive)语句。对此的其他操作将像运行控制台应用程序一样激发,为您提供前面提到的在更友好的环境中调试/开发的优势。

修改

*如果您没有安装,请包含安装程序ProjectInstaller.cs

确保正确配置了ProjectInstaller.cs。 (也许你没有指定一个合适的名字)。这是我的剥离版本,使用“MyService”作为名称

[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary> 
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    public ProjectInstaller()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
        this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
        // 
        // serviceProcessInstaller1
        // 

        this.serviceProcessInstaller1.Password = "username";
        this.serviceProcessInstaller1.Username = @"password";
        // 
        // serviceInstaller1
        // 
        this.serviceInstaller1.ServiceName = "MyService";
        // 
        // ProjectInstaller
        // 
        this.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.serviceProcessInstaller1,
        this.serviceInstaller1});

    }

    private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
    private System.ServiceProcess.ServiceInstaller serviceInstaller1;

}

答案 1 :(得分:2)

您需要向服务项目添加服务安装程序。最简单的方法是关闭所有代码窗口。然后双击您的服务,它应该在设计视图中打开服务。

在属性窗口的底部,现在应该是一个名为“添加安装程序”的链接。单击它,它应该添加一个Project Installer,它将包括Service Installer和Service Process安装程序。它们具有诸如运行服务的用户帐户等属性,等等。

这个类包含安装服务的逻辑。