相关疑难解决方法(0)

我是作为一种服务运行的

我目前正在为可以在控制台中运行的服务编写一些引导代码.它本质上归结为调用OnStart()方法而不是使用ServiceBase来启动和停止服务(因为如果它没有作为服务安装并且使调试成为一场噩梦,它就不会运行应用程序).

现在我使用Debugger.IsAttached来确定我是否应该使用ServiceBase.Run或[service] .OnStart,但我知道这不是最好的主意,因为有些时候最终用户想要在控制台中运行服务(看看输出等实时).

关于如何确定Windows服务控制器是否启动"我",或者用户是否在控制台中启动"我"的任何想法?Apparantly Environment.IsUserInteractive不是答案.我想过使用命令行args,但这看起来很"脏".

我总是可以看到围绕ServiceBase.Run的try-catch语句,但这看起来很脏.编辑:尝试捕获不起作用.

我有一个解决方案:把它放在这里给所有其他感兴趣的堆叠器:

    public void Run()
    {
        if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
        {
            RunAllServices();
        }
        else
        {
            try
            {
                string temp = Console.Title;
                ServiceBase.Run((ServiceBase[])ComponentsToRun);
            }
            catch
            {
                RunAllServices();
            }
        }
    } // void Run

    private void RunAllServices()
    {
        foreach (ConsoleService component in ComponentsToRun)
        {
            component.Start();
        }
        WaitForCTRLC();
        foreach (ConsoleService component in ComponentsToRun)
        {
            component.Stop();
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:在StackOverflow上有另一个问题,那个人有环境问题.CurrentDirectory是"C:\ Windows\System32"看起来可能是答案.我今天要考试.

.net c# windows-services

44
推荐指数
6
解决办法
3万
查看次数

如何检测Topshelf是否在控制台模式下运行

我正在使用Topshelf与FluentSchedule结合使用Windows服务.

但是,我希望能够试运行应用程序只是启动而不执行设置计时器等的FluentSchedule代码.

有没有办法从命令行运行exe文件(即没有'install'命令)从TopShelf检查它是否在控制台模式下运行?

topshelf

12
推荐指数
2
解决办法
4105
查看次数

我们如何判断C++应用程序是否作为Windows服务启动?

我们有一个控制台应用程序,我们从命令提示符启动进行调试,但我们也将其作为生产的NT服务启动.

现在,代码有这样的逻辑:

if (__argc <= 1) {
  assumeService();
} else {
  assumeForgound();
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来检查流程是如何启动的?我们是一个开源项目,所以每次我们得到一个新的Windows开发人员时,我们必须解释他们必须指定-farg来阻止应用程序连接到服务控制器.

那么检查父进程呢?

更新:

我忘了提到我们正在使用C++(非托管).

c++ windows-services

7
推荐指数
2
解决办法
3988
查看次数

标签 统计

windows-services ×2

.net ×1

c# ×1

c++ ×1

topshelf ×1