0

我创建了一个超级简单的 Windows 服务程序。我选择了程序 Project -> Windows Service,之后我将其更改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()。之前我改了partial类的名字,VS2010全改了名字。

4

2 回答 2

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) 语句。对此的 else 将像运行控制台应用程序一样触发,为您提供前面提到的在更友好的环境中调试/开发的优势。

编辑

*如果您没有安装程序,请包括一个安装程序,例如 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;

}
于 2013-09-03T13:22:36.227 回答
2

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

在属性窗口的底部现在应该是一个名为“添加安装程序”的链接。单击它,它应该添加一个项目安装程序,其中将包括一个服务安装程序和一个服务进程安装程序。这些具有属性,例如您的服务应在其下运行的用户帐户等。

正是此类包含安装服务的逻辑。

于 2013-09-04T07:02:00.810 回答