相关疑难解决方法(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万
查看次数

C#/ .NET:检测程序是作为服务还是作为控制台应用程序运行

我有一个C#/ .NET程序,可以作为控制台应用程序和服务运行.目前我给它一个命令行选项来启动作为控制台应用程序,但我想避免这种情况.

是否有可能以编程方式检测我的程序是否作为服务启动?

如果它是纯Win32,我可以尝试使用StartServiceCtrlDispatcher作为服务启动并返回到控制台,如果它返回ERROR_FAILED_SERVICE_CONTROLLER_CONNECT,但System.ServiceProcess.ServiceBase.Run()弹出一个errordialog如果它失败然后只返回没有发出错误信号到该计划.

有任何想法吗?

.net c# service

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

如何确定我是否作为控制台应用程序运行?(Win32上的Delphi)

我有一个通用单元,可以记录到GExperts Debugger和/或OutputDebugString.我将在控制台应用程序中使用它,所以我希望它能够通过输出到stdout writeln().
主可执行文件已经有{$ APPTYPE CONSOLE},但我不认为这对我有帮助.将从几个地方调用日志记录例程:

  1. 主控制台应用程序,将链接到BPL,
  2. 来自另一个"需要"第一个bpl的BPL,.....
  3. 从静态链接单元的DLL.

将构建BPL和DLL而不能查看{$ APPTYPE CONSOLE}指令,因此我不能使用IFDEF条件编译.BPL和DLL需要能够以任何方式进行,具体取决于主应用程序是否是常规的winapp或控制台应用程序.

我遇到的一个丑陋的解决方案是使用可执行文件的名称.例如:

if (UpperCase(ExtractFileName(ParamStr(0))) = 'MYCONSOLEAPP.EXE')  then ...
Run Code Online (Sandbox Code Playgroud)

但我讨厌这样做,因为我可以有其他控制台应用程序......

我宁愿只有一个神奇的函数AmIAConsoleApp:boolean; 有什么相似的吗?我在这个项目上使用Delphi2005.

更新:我看到我对这个问题有点重复,但我想调查德尔福人,看看是否有更好的方法.

delphi console-application

9
推荐指数
1
解决办法
2049
查看次数