Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在自动启动时将参数传递给Windows服务_C#_Windows Services - Fatal编程技术网

C# 在自动启动时将参数传递给Windows服务

C# 在自动启动时将参数传递给Windows服务,c#,windows-services,C#,Windows Services,我发现了一些类似的问题,但答案似乎对我的情况没有帮助。我希望使用1个参数配置自动启动的服务 我的service OnStart方法如下所示: /// <summary> /// Starts the service /// </summary> /// <param name="args">args must contain the listening port number of the service</param&g

我发现了一些类似的问题,但答案似乎对我的情况没有帮助。我希望使用1个参数配置自动启动的服务

我的service OnStart方法如下所示:

    /// <summary>
    /// Starts the service
    /// </summary>
    /// <param name="args">args must contain the listening port number of the service</param>
    protected override void OnStart(string[] args)
    {
        if (args != null && args.Length > 0)
        {
            int port = -1;
            if (int.TryParse(args[0], out port) && port >= 0 && port <= 65535)
            {
                server.Start(port);
            }
            else
            {
                Log.Entry("Port value " + args[0] + " is not a valid port number!", Log.Level.Error);
            }
        }
        else
        {
            Log.Entry("Service must be started with the port number (integer) as parameter.", Log.Level.Error);
            throw new ArgumentNullException("Service must be started with the port number (integer) as parameter."); // stop the service!
        }
    }
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service()
        };
        ServiceBase.Run(ServicesToRun);
    }
}
//
///启动服务
/// 
///args必须包含服务的侦听端口号
启动时受保护的覆盖无效(字符串[]args)
{
如果(args!=null&&args.Length>0)
{
int端口=-1;

如果服务启动时(int.TryParse(args[0],out port)&&port>=0&&port,则有两个不同的参数列表

第一个来自命令行,如服务管理工具中的“可执行文件路径”所示。这是您放置参数8081的地方,如屏幕截图所示

在.NET服务中,这些参数被传递给
Main()
函数

第二个是服务启动参数,在手动启动服务时提供。如果使用服务管理工具启动服务,此参数列表取自屏幕截图中为空的“启动参数”字段

在.NET服务中,这些参数被传递给
OnStart()
函数

因此,在您的场景中,您应该修改
Main()
,以便它将命令行参数传递给您的服务类。通常,您会在构造函数中提供这些参数,但如果愿意,您可以使用全局变量


(另请参阅服务启动的更详细描述。)

@Harry Johnston的回答是正确的。我只想添加一点代码来支持它

服务的入口点位于文件“Program.cs”中。默认情况下,它如下所示:

    /// <summary>
    /// Starts the service
    /// </summary>
    /// <param name="args">args must contain the listening port number of the service</param>
    protected override void OnStart(string[] args)
    {
        if (args != null && args.Length > 0)
        {
            int port = -1;
            if (int.TryParse(args[0], out port) && port >= 0 && port <= 65535)
            {
                server.Start(port);
            }
            else
            {
                Log.Entry("Port value " + args[0] + " is not a valid port number!", Log.Level.Error);
            }
        }
        else
        {
            Log.Entry("Service must be started with the port number (integer) as parameter.", Log.Level.Error);
            throw new ArgumentNullException("Service must be started with the port number (integer) as parameter."); // stop the service!
        }
    }
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service()
        };
        ServiceBase.Run(ServicesToRun);
    }
}
然后,您只需要向接受参数的服务添加一个构造函数


现在,该服务可以通过一个参数自动启动。

@Filburt如果你把它放在那里,它只有在你“启动”或“重启”时才会被使用从对话框中手动启动服务,而不是在系统启动时自动启动服务。任何特殊原因都必须通过参数而不是.NET配置文件中的正常条目来实现吗?@Damien_不相信者主要是出于简单的原因。如果不可能,我将恢复到配置文件。这两者都是这让我有点紧张,因为这样做应该是可能的,这让我很想知道怎么做。