如何解决在控制台模式下运行Windows服务?
| 我发现一些示例代码发布在 https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/4d45e9ea5471cba4/4519371a77ed4a74?hl=zh-CN&pli=1 自行安装Windows服务。我在fx 4.0上使用C#。试 弄清楚我偏离了轨道... 我的问题: 我创建了一个Win Service项目。在program.cs / main()中,我几乎 复制了代码示例。看来大多数事情都在起作用 如果我处于DEBUG模式,则启动控制台窗口除外(传入- c当然)。由于某些原因,控制台窗口永远不会打开。 我遇到的另一项挑战是在其中调用StartUp()/ ShutDown() 控制台部分将无法编译。我最终不得不初始化 我的服务对象,然后调用它。 调用Console.ReadKey()方法时出现以下错误: 在任何一种情况下均无法读取按键 应用程序没有控制台或 控制台输入已重定向时 从文件。尝试Console.Read。 我的代码和东西: 我的项目结构图: 注意:我在复制TestHarness中的启动顺序时 在调试模式下。如果/当我开始工作时,我会放弃 从解决方案。我大部分的图书馆项目 代码的生命。 程序CSusing System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ComponentModel;
using System.Configuration.Install;
using System.Collections;
using RivWorks.FeedHandler.Service;
namespace RivWorks.FeedHandler
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static int Main(string[] args)
{
bool install = false,uninstall = false,console = false,rethrow = false;
try
{
foreach (string arg in args)
{
switch (arg)
{
case \"-i\":
case \"-install\":
install = true; break;
case \"-u\":
case \"-uninstall\":
uninstall = true; break;
case \"-c\":
case \"-console\":
console = true; break;
default:
Console.Error.WriteLine(\"Argument not expected: \" + arg);
break;
}
}
if (uninstall)
{
Install(true,args);
}
if (install)
{
Install(false,args);
}
if (console)
{
Console.WriteLine(\"Starting...\");
FeedListener fl = new FeedListener();
fl.StartUp();
Console.WriteLine(\"System running; press any key to stop\");
Console.ReadKey(true);
fl.ShutDown();
Console.WriteLine(\"System stopped\");
}
else if (!(install || uninstall))
{
rethrow = true; // so that windows sees error...
ServiceBase[] services = { new Service.FeedListener() };
ServiceBase.Run(services);
rethrow = false;
}
return 0;
}
catch (Exception ex)
{
if (rethrow) throw;
Console.Error.WriteLine(ex.Message);
return -1;
}
}
static void Install(bool undo,string[] args)
{
try
{
Console.WriteLine(undo ? \"uninstalling\" : \"installing\");
using (AssemblyInstaller inst = new AssemblyInstaller(typeof(Program).Assembly,args))
{
IDictionary state = new Hashtable();
inst.UseNewContext = true;
try
{
if (undo)
{
inst.Uninstall(state);
}
else
{
inst.Install(state);
inst.Commit(state);
}
}
catch
{
try
{
inst.Rollback(state);
}
catch { }
throw;
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
}
[RunInstaller(true)]
public sealed class MyServiceInstallerProcess : ServiceProcessInstaller
{
public MyServiceInstallerProcess()
{
this.Account = ServiceAccount.NetworkService;
}
}
[RunInstaller(true)]
public sealed class MyServiceInstaller : ServiceInstaller
{
public MyServiceInstaller()
{
this.Description = \"Provides a service to listen for,then import,feed files from various sources.\";
this.DisplayName = \"RIVWorks Feed Handler (.NET 4.0)\";
this.ServiceName = \"FeedListener\";
this.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
}
}
}
FEEDLISTENER.CS
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using sysIO = System.IO;
using RivWorks.FeedHandler;
using System.Collections;
using RivWorks.FeedHandler.Library;
using System.Threading;
namespace RivWorks.FeedHandler.Service
{
public partial class FeedListener : ServiceBase
{
#region Declarations
static private List<string> _keys = new List<string>();
static private System.Threading.Timer _clock = null;
static private FileSystemWatcher _watcher;
static private RivWorks.FeedHandler.Library.QueueHandler _qHandler = null;
static private bool _isDequeueing = false;
#endregion
#region Constructor
public FeedListener()
{
InitializeComponent();
}
#endregion
#region Internal Methods
internal void StartUp() {...}
internal void ShutDown() {...}
#endregion
#region Start/Stop
protected override void OnStart(string[] args)
{
StartUp();
}
protected override void OnStop()
{
ShutDown();
}
#endregion
#region Event Handlers
static void qHandler_QueuesGrew() {...}
static void qHandler_QueuesShrunk() {...}
static void qHandler_QueuesChanged() {...}
static void fileCreatedOrChanged(object sender,sysIO.FileSystemEventArgs e) {...}
#endregion
#region Private Methods
private static void Tick(object state) {...}
private static void WriteToEventLog(Exception ex,EventLogEntryType eventLogEntryType) {...}
private static void WriteToEventLog(string message,EventLogEntryType eventLogEntryType) {...}
#endregion
}
}
解决方法
我找到了答案!我的项目属性设置为Windows App,而不是Console App。 DOH! (项目属性>应用程序选项卡>输出类型:)
,另外,也可以使用Environment.UserInteractive而不是-console arg来标识其控制台,该控制台在作为服务运行时为false,但在直接运行EXE时为true。
,您也可以查看以下内容:http://www.thedavejay.com/2012/04/self-installing-c-windows-service-safe.html
它允许您作为控制台应用程序进行调试,并安装与Windows服务相同的应用程序,而无需更改项目类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。