2

如何将 C# 中的控制台应用程序转换为 Windows 服务?有模板可以做到吗?

4

3 回答 3

9

在您的代码内部,您可以使用 Environment.UserInteractive 属性来确定您处于控制台/服务中的哪种模式。

例子:

static class Program
{
    static void Main(params string[] args)
    {
        var service = new Service1();

        if (!Environment.UserInteractive)
        {
            var servicesToRun = new ServiceBase[] { service };
            ServiceBase.Run(servicesToRun);
            return;
        }

        Console.WriteLine("Running as a Console Application");
        Console.WriteLine(" 1. Run Service");
        Console.WriteLine(" 2. Other Option");
        Console.WriteLine(" 3. Exit");
        Console.Write("Enter Option: ");

        var input = Console.ReadLine();

        switch (input)
        {
            case "1":
                service.Start(args);
                Console.WriteLine("Running Service - Press Enter To Exit");
                Console.ReadLine();
                break;
            case "2":
                break;
        }
        Console.WriteLine("Closing");
    }
}

public partial class Service1 : ServiceBase
{
    public Service1() { InitializeComponent(); }
    public void Start(string[] args) { OnStart(args); }
    protected override void OnStart(string[] args) { }
    protected override void OnStop() { }
}
于 2013-03-19T07:32:15.090 回答
0

当我在调试模式下构建以简化调试时,我经常让我的 Windows 服务作为控制台应用程序运行。

在您的情况下,最直接的方法可能是创建一个新的 Windows 服务以具有正确的主入口点结构和正确的引用,然后将您的控制台应用程序代码集成到该结构中。

必须重写从控制台读取/写入。

如果您必须阅读用户输入,请考虑使用其他方法将该输入提供给服务。如果您将输出写入控制台,请将其写入日志。我个人会推荐 NLog。

于 2013-03-19T07:22:18.323 回答
-3

项目的常规属性-> 将类型更改为类库。
您可以删除主函数,因为它不会被调用

于 2013-03-19T08:08:45.640 回答