如何检测C#项目类型和/或如何检测控制台可用性

时间:2010-03-11 12:26:40

标签: c# windows-services console-application windows

我有两个用C#编写的Windows服务。一项服务是“控制台应用程序”,第二项是“Windows应用程序”(无法更改)。 两个服务应用程序都可以在几种模式下执行(取决于命令行参数和Environment.UserInteractive标志):

  • 何时(Environment.UserInteractive == false)和......
    • 未提供cmd-line参数时 - 执行标准的生成代码(SCM所需) - ServiceBase.Run(ServicesToRun)
  • 何时(Environment.UserInteractive == true)和......
    • 当提供“-i”cmd-line参数时 - 服务应用程序自行安装(类似 installutil -i [scv_app]
    • 当提供“-u”cmd-line参数时 - 服务应用程序自行卸载(类似 installutil -u [scv_app]
    • 当提供“-c”cmd-line参数时 - 以“控制台”模式执行服务(用于调试目的)

两个服务都使用类库中的静态方法来选择和处理描述的执行路径。 但是,我在这个类库中有一个问题 - 当应用程序具有类型“Windows Application”时,Console.WriteLine()没有可见效果。在这种情况下,我可以使用Win32 AttachConsole()或类似的东西,但我更喜欢通过MessageBox.Show()显示汇总消息。 因此,我认为在类库中我需要知道应用程序是“控制台应用程序”还是“Windows应用程序”......你知道怎么做吗?

一开始,我没有尝试检测应用类型,而是尝试编写类似的内容:

if (string.IsNullOrEmpty(Console.Title) == false) Console.WriteLine(msg); 

它适用于Win7,但在Win2k3下无效。 那么也许有更好的方法来检测Console.WriteLine(msg) / Console.ReadLine是否按预期工作? 我已经看到了其他一些建议(sublinked here),但它们对我来说都不好看。我正在寻找“漂亮”的解决方案(!= p / invoke;!=访问try / catch块中的任何Console对象属性(例如Title))。

2 个答案:

答案 0 :(得分:1)

  1. Windows服务不应该有ui。这包括控制台和消息框。
  2. 有了这个......

    您是否考虑过将适当的跟踪侦听器连接到System.Diagnostics.Trace.TraceListeners?根据您的命令行,您可以添加一个MessageBox tracelistener或一个将跟踪消息转储到控制台的tracelistener?您将利用内置的调试机制,这些机制已经过广泛测试,并且以自己的方式,也是非常可扩展的。您还可以隐式区分在发布模式下显示的消息与在调试模式下显示的消息(通过System.Diagnostics.Trace.Write()System.Diagnostics.Debug.Write())。

答案 1 :(得分:0)

在处理类库时,我会根据调用库的环境传入UI对象。

public interface IAlerts { 
    void Show(string message);
}

public class EventLogAlerts : IAlerts { ... }

public class WindowsAlerts : IAlerts { ... }

public class ConsoleAlerts : IAlerts { ... }

public class MyLibrary {
    private IAlerts alertImpl = new EventLogAlerts();
    public void SetUserInterface(IMyUserInterface impl) 
    {
        this.alertImpl = impl;
    }

    public void DoSomething()
    {
        try 
        {
            ...
        }
        catch (Exception)
        {
            this.alertImpl.Show("Whoops!");
        }  
    }
}