所以基本上我正在尝试在Visual Studio 2017下用C#编写Windows服务。由于服务没有做我想做的事情,我用一个非常基本的逻辑来测试服务,以测试它是否甚至做了什么我想在OnStart()方法中。我选择手动将字符串写入事件日志的原因是因为我想确保没有写入权限问题。我的意思是如果服务安装并启动,它应该写入日志不应该行吗?
所以:
namespace WindowsService3
{
public class Program : System.ServiceProcess.ServiceBase
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
protected override void OnStart(string[] args)
{
this.EventLog.WriteEntry("Hello");
}
protected override void OnStop()
{
}
}
}
我添加了一个ProjectInstaller,为它添加了服务名称,并为LocalSystem指定了它。然后我使用以下行安装它:
C:\Windows\system32>sc \\10.10.0.122 create TESTService binPath= "C:\temp\service\WindowsService1.exe"
现在可以在服务管理器中看到该服务,甚至可以启动该服务。没有问题...在事件日志中,虽然我没有看到指定的行。所以似乎服务正确启动,但它没有使用OnStart()方法中的逻辑。我不知道为什么。我也尝试过首先通过OnStart()方法创建文本文件......也没有成功。我究竟做错了什么?同样,服务IS已安装,IS作为事件日志和服务管理器建议启动。
编辑:我的问题是根本没有代码在OnStart中执行。我不能写文件,我不能写日志,什么都没有。该服务刚刚安装并且可以启动,但我没有做任何放入OnStart()的东西,我不知道为什么。我的同事也无法理解。
Edit2:VS2017模板告诉我让Program类保持静态。但是我不能在其中使用OnStart()。但也许这是我的误解?在我的例子中,我让Program类公开实现OnStart(),但也许这是错误的?
答案 0 :(得分:1)
您已在类Program
中编写了服务代码,但启动的服务名为Service1
,可能由另一个文件中的模板定义。
编辑Service1.cs以包含您的启动代码,或编辑您的Program.cs以启动您的类:
ServicesToRun = new ServiceBase[]
{
new Program() // <----
};
将您的服务和Program.cs放在同一个类中并不常见,这确实是将它们分开并具有单独Service类的好方法。
答案 1 :(得分:0)
尝试以这种方式记录,然后在“应用程序错误:
”下检查事件记录器 using (EventLog eventLog = new EventLog("Application"))
{
eventLog.Source = "Application";
eventLog.WriteEntry("Message", EventLogEntryType.Error);
}