Hallo,
ich versuche gerade einen Dienst einzurichten, der auf diverse PowerEvent-Nachrichten reagieren kann. Der Dienst an sich scheint laut Dienste-Panel soweit zu laufen und in der LogDatei wird auch das Starten bzw. Beenden des Dienstes protokolliert. Schicke ich den PC jedoch in den StandBy und wecke ihn wieder auf, ist nichts in die Logdatei eingetgragen worden.
Der Dienst wurde mit InstallUtil.exe via CMD ohne weitere Parameter installiert. Die Anmeldung habe ich aus Verzweiflung auch schon auf "lokales Systemkonto" sowie ".\Admin" gestellt und auch mal das Häkchen bei "Datenaustausch zwischen Dienst und Desktop zulassen" gesetzt, leider ohne Erfolg. Ich habe die Exe mit Visual Studio 2012 / .Net 4 unter Windows 7 Prof 64 Bit erstellt. Reicht es bei einem Dienst für das Empfangen derartiger Events aus, die CanHandlePowerEvent-Eigenschaft auf TRUE zu setzen und die ServiceBase-Methode zu überschreiben?
Hat von euch jemand eine Idee, wo der Fehler liegt?
namespace WinServiceProject
{
using System;
using System.IO;
using System.ServiceProcess;
class WinService : System.ServiceProcess.ServiceBase
{
private string folderPath = @"c:\logs";
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun =
new System.ServiceProcess.ServiceBase[] { new WinService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
private void InitializeComponent()
{
this.ServiceName = "WinService";
this.CanHandlePowerEvent = true;
}
protected override void OnStart(string[] args)
{
WriteLog("Gestartet");
}
protected override void OnStop()
{
WriteLog("Beendet");
}
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
WriteLog(powerStatus.ToString());
return base.OnPowerEvent(powerStatus);
}
private void WriteLog(string text)
{
if (!System.IO.Directory.Exists(folderPath))
System.IO.Directory.CreateDirectory(folderPath);
FileStream fs = new FileStream(folderPath + "\\logDatei.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(text + " - " +
DateTime.Now.ToShortDateString() + " " +
DateTime.Now.ToLongTimeString() + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
}
}
}
Viele Grüße,
PaulchenP
InitializeComponent ? 😃
Edit: InitializeComponent aufrufen könnte helfen
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Könnte helfen: http://topshelf-project.com/
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
Hallo Programmierhans,
vielen Dank für den Tipp, das war die Lösung! 👍
Ich nahm fälschlicherweise an, dass diese Methode automatisch aufgerufen wird.
Viele Grüße,
PaulchenP