没有Visual Studio干扰的Windows服务

时间:2011-02-09 14:31:25

标签: .net windows-services designer

我想在没有Visual Studio设计人员“帮助”的情况下创建和管理Windows服务应用程序。

由于这是.NET,并且根据MSDN和设计师的行为来判断,这意味着继承Installer,并构建和处理ServiceProcessInstallerServiceInstaller以便能够管理安装时执行服务。

运行时,这意味着创建ServiceBase子类并使用MainServiceBase.Run启动它(并覆盖各种ServiceBase事件处理方法。)

然而,当我这样做时,Visual Studio坚持将InstallerServiceBase子类视为设计者编辑的文件。这并不完全有助于提高可读性,更不用说它通常根本无法处理手写代码。 我想避免设计人员让事情变得易于管理(以避免模糊不清谁知道什么时候运行,特别是对于那些测试和调试很棘手的代码,比如毕竟的Windows服务< em>必须安装才能运行),并且能够在运行时而不是在编译时指定服务名称 - 设计者不支持。

如何在没有所有垃圾的情况下创建Windows服务应用程序?

4 个答案:

答案 0 :(得分:10)

ServiceBase源自Component。要禁用设计器视图,您可以附加属性,如下所示:

[System.ComponentModel.DesignerCategory("Code")]
public class MyService : ServiceBase
{

}

答案 1 :(得分:5)

因为我经常创建服务,所以这样做:

我有一个如下所示的公共基类:

internal class ServiceRunner : ServiceBase {
   protected static void Startup(string[] args, ServiceRunner instance, bool interactiveWait) {    
    if (instance == null)
        throw new ArgumentNullException("instance");

    if (Environment.UserInteractive) {
        instance.OnStart(args);
        if (interactiveWait) {
            Console.WriteLine("Press any key to stop service");
            Console.ReadKey();
        }
        instance.OnStop();
    }
    else
        Run(instance);
}

然后我创建我的所有服务

internal class MyService : ServiceRunner
{
    public MyService() {
        ServiceName = ConfigurationManager.AppSettings["MyServiceName"];
    }

    private static void Main(string[] args) {
        Startup(args, new MyService(), true);
    }

    protected override void OnStart(string[] args) {
        base.OnStart(args);
        ...
    }

    protected override void OnStop() {
        ...
        base.OnStop();
    }
}

现在我可以通过在调试器或命令行中运行它来测试服务。

安装时我使用命令行

sc create ServiceName binPath= C:\...\MyService.exe

(我无法阻止设计师双击打开)

答案 2 :(得分:2)

好吧,只需删除构造函数中的InitializeComponent()调用,设计器生成的代码就不在你的头发中了。

答案 3 :(得分:-1)

VS确实添加了一些额外的东西,但我真的不担心它。这是一个在VS2005中手动创建简单服务的教程,它也适用于新版本。

http://www.codeproject.com/KB/system/WindowsService.aspx