可以';t请参阅已安装的Windows服务

本文关键字:安装 Windows 服务 请参阅 可以 | 更新日期: 2023-09-27 18:29:58

我创建了一个超级简单的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对名称进行了全面更改。

可以';t请参阅已安装的Windows服务

这对我有效

安装:

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;
}

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

现在,在属性窗口的底部应该有一个名为"添加安装程序"的链接。单击该按钮,它将添加一个项目安装程序,其中将包括一个服务安装程序和一个服务流程安装程序。这些都有一些属性,比如你的服务应该在哪个用户帐户下运行,等等。

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