【发布时间】:2010-03-11 12:26:39
【问题描述】:
我有两个用 C# 编写的 Windows 服务。一项服务是“控制台应用程序”,第二项服务是“Windows 应用程序”(无法更改)。
两种服务应用程序都可以在几种模式下执行(取决于命令行参数和Environment.UserInteractive 标志):
- 当 (
Environment.UserInteractive == false) 和...- 当没有提供命令行参数时 - 执行标准的生成代码(SCM 需要) -
ServiceBase.Run(ServicesToRun)
- 当没有提供命令行参数时 - 执行标准的生成代码(SCM 需要) -
- 当 (
Environment.UserInteractive == true) 和...- 当提供“-i”命令行参数时 - 服务应用程序自行安装(类似于 installutil -i [scv_app])
- 当提供“-u”命令行参数时 - 服务应用程序自行卸载(类似于 installutil -u [scv_app])
- 当提供“-c”命令行参数时 - 服务以“控制台”模式执行(用于调试目的)
两个服务都使用类库中的静态方法来选择和处理描述的执行路径。
但是,我在这个类库中有一个问题——当应用程序的类型为“Windows 应用程序”时,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 块内的任何控制台对象属性(例如标题))。
【问题讨论】:
-
您可以使用格式按钮格式化代码吗? (代码按钮看起来像 1 和 0)。
-
库真的不应该与用户界面交互,你能用日志库代替吗?
标签: c# windows-services console-application windows