C# 如何在windows服务中手动添加安装程序?

C# 如何在windows服务中手动添加安装程序?,c#,windows-services,C#,Windows Services,我编写了一个从ServiceBase继承的抽象类“PollingServiceBase”,以便编写windows服务,该服务具有一个重写方法Work,该方法在构造函数中声明的计时器上执行。所以我正在尝试测试它,我编写了一个快速的小类,它每分钟都会将包含日期时间的行写入一个文本文件。我需要安装此服务,但由于PollingServiceBase是抽象的,因此无法使用设计器“添加安装程序”。因此,任何人都可以给我一个解决方法,或者让我找到一个资源,告诉我如何手动执行此操作?只需通过代码在您的服务中添加

我编写了一个从ServiceBase继承的抽象类“PollingServiceBase”,以便编写windows服务,该服务具有一个重写方法Work,该方法在构造函数中声明的计时器上执行。所以我正在尝试测试它,我编写了一个快速的小类,它每分钟都会将包含日期时间的行写入一个文本文件。我需要安装此服务,但由于PollingServiceBase是抽象的,因此无法使用设计器“添加安装程序”。因此,任何人都可以给我一个解决方法,或者让我找到一个资源,告诉我如何手动执行此操作?

只需通过代码在您的服务中添加一个新的:

ServiceInstaller installer = new ServiceInstaller();
并确保正确使用属性

为了方便起见,我建议您查看TopShelf。这是一个很好的库,可以编写Windows服务并使其通过F5运行。基本上,它是一个控制台应用程序

以下是关于TopShelf的一些信息:

如果您仍然希望坚持基本实现,下面是一些代码:

using (TransactedInstaller installer = new TransactedInstaller())
{
    string path = string.Format("/assemblypath={0}",
                  System.Reflection.Assembly.GetExecutingAssembly().Location);
    string[] arguments = { path };
    InstallContext context = new InstallContext("", arguments);

    using (ProjectInstaller projectInstaller = new ProjectInstaller())
    {
        installer.Installers.Add(projectInstaller);
    }

    installer.Context = context;
    installer.Install(new Hashtable());
}

首先,我喜欢TopShelf的想法。几个月前我就可以用这个了。我想我现在的问题是它看起来像一个创可贴。我需要人们能够安装从我的PollingServiceBase继承的自己的服务。我正在查看您发布的代码,希望您能原谅我对主题的不熟悉,但我将在哪里实现呢?在我的服务中,在基类中,或者在服务的program.cs文件中?在我的项目中,它处于应用程序的启动阶段。基本上,它是一个控制台应用程序,当第一个命令行参数为“/install”时,上面的代码正在运行。我不知道您的情况,但我认为从基类继承的每个客户端都需要使用此代码。但是,您可以将其嵌入基类中,让用户在程序中直接调用它。如果不清楚,只需询问:-)您知道可以从命令行安装它,如下所示:
sc create myservicecename binPath=c:\myservicecdirectory\MyExe.exe