C# Windows Dienste

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
also noch ewig langem suchen und googlen, hab ichs immernoch nicht geschafft das richtige für mich zu finden.

Es geht darum, dass ich nen kleinen Windows Dienst programmieren will, aber es irgendwie nicht so ganz packe! Die InstallUtil.exe habe ich gefunden, konnte auch diese ausführen auf mein Tool (das als Dienst laufen soll), aber das Utility konnte es nicht als Dienst eintragen!!

Wo mein Fehler liegt, weiß ich denke ich, jedoch komme ich hier nicht weiter!

Da ich die Express Version von VS habe kann ich also kein Explizites "Windows Service Project" erstellen!! Also muss ich mir irgendwie anders aushelfen... habe dazu ein Konsolen Projekt erstellt und die Anwendung programmiert, kompiliert und wenn ich sie normal ausführe läuft auch alles super (nur das InstallUtil kann es nicht als Dienst eintragen).

So weit ich weiß gibt es da doch bei nem Windows Service irgendwie so ne Art Einsprungspunkt damit er die Anwendung als Dienst installiert. Wie lautet diese den? Ich hab null peilung welcher Code mir da fehlt damit er das Tool als Dienst akzeptiert und installiert!!

Bitte um Hilfe!
 
Danke für die die Links. Werde sie mir gleich mal anschauen. Aber das mit Codeguru sieht schon mal gut aus. Mal gucken ob ich es in VS auch ohne dieses Service Project Template schaffe =)
Ergänzung ()

Ok also ich bin nun ein Stück weiter, aber jetzt hab ich doch wieder ein Problem beim installieren!!

Bei mir kommt ständig folgende Meldung wenn ich es versuche zu installieren:
"Während der Installationsphase ist eine Ausnahme aufgetreten.
System.Security.SecurityException: Die Quelle wurde nicht gefunden, aber einige oder alle Ereignisprotokolle konnten nicht durchsucht werden. Protokolle, auf die kein Zugriff möglich war: Security."
 
Hmm - immer so wenige Informationen ;).

Was für Berechtigungen hat denn dein Account mit dem du installieren willst?

Bist du Admin?
 
Zuletzt bearbeitet: (Typo)
Dieses Problem hat sich erledigt. Lag tatsächlich an den Adminrechten =D

Aber mal ne andere Frage hierzu. Wie kann man den Service ausführen, dass der ständig etwas macht? Also bei einer Application kann ich ja einfach ne Endlos-Schleife verwenden. Aber wie funzt es beim Service?

Wenn ich die Schleife nämlich raußnehme, dann führt er nur einmalig eine Aktion aus und zwar wenn er startet. Wenn ich jedoch die Endlos-Schleife einbaue, dann startet er, führt seine Aktion aus, aber nach ca. ner halben bis ganzen Minute beendet er sich selbst!
Also wie kann ich es so einrichten, dass er dauerhaft läuft und ständig am arbeiten ist (z.B. etwas prüft)??
 
Hallo Leute,
ich bins nochmal.

Kann mir vielleicht mal einer helfen? Immernoch sitze ich an dem verdammten dienst. Er will und und will einfach nicht!! Und durch die ganzen verdammten unterschiedlichen Beiträge über Windows Dienste komme ich nur durcheinander, aber helfen tun die ganz bestimmt nicht.

Jedes mal was anderes, man kann Schleifen verwenden, man kann es nicht, man kann Forms verwenden, man kann es nicht, man kann Timer verwenden, man kann es nicht, etc....

Also in dem letzten Beitrag z.B. habe ich gelesen, dass man Timer benutzt um etwas zu prüfen beim Dienst. Ich hab nen Timer verwendet und was passiert? Es funzt ÜBERHAUPT NICHT!!!

Hier mal mein Code:
Code:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.ServiceProcess;
using System.IO;
using System.Threading;
using System.Security;
using System.Text;

namespace MyService {
	public class bpService : ServiceBase {
		private System.Windows.Forms.Timer timeUpdate;
		private IContainer components;
	
		public bpService() {
			InitializeComponent();
		}

		// The main entry point for the process
		static void Main() {
			ServiceBase[] ServicesToRun;
			ServicesToRun = new ServiceBase[] { new bpService() };
			ServiceBase.Run(ServicesToRun);
		}

		private void InitializeComponent() {
			this.components = new System.ComponentModel.Container();
			this.timeUpdate = new System.Windows.Forms.Timer(this.components);
			// 
			// timeUpdate
			// 
			this.timeUpdate.Interval = 1000;
			this.timeUpdate.Tick += new System.EventHandler(this.timeUpdate_Tick);
			// 
			// bpService
			// 
			this.ServiceName = "MyService";

		}

		protected override void OnStart(string[] args) {
			timeUpdate.Enabled = true;
		}
		protected override void OnStop() {
			timeUpdate.Enabled = false;
		}

		private void timeUpdate_Tick(object sender, EventArgs e) {
			if (DateTime.Now.TimeOfDay.ToString().Remove(8) == "13:22:00") {
				UpdateFunktion();
			}
		}
	}
}

Mein Ziel ist es halt zu einer gegeben Zeit ne Datei runter zu laden und eine andere zu ersetzen damit (Update durchführen). Der Dienst soll natürlich beim booten automatisch starten und zur gegeben Zeit eben diese Updatefunktion ausführen die diese Datein austauscht (updatet). Da das ganze am Server laufen soll muss es auch funktionieren, wenn sich keiner angemeldet hat!

Aber ich krieg das einfach nicht hin. Bin wirklich total am verzweifeln.

Hoffe ihr könnt mir helfen!!
Ergänzung ()

Ich hätte da im übrigen noch ne Frage. Da mein Dienst die Datei ja von einem http Server runterladen muss hab ich mich gefragt ob da als ServiceAccount => LocalSystem genügt. Oder muss es unbedingt Network sein?
 
Nimm mal lieber den System.Timers.Timer statt System.Windows.Forms.Timer, weil dein verwendeter Timer eine Meldungsschleife benötigt, die du in deinem Service nicht hast. Ist halt eine ganz schlechte Idee etwas aus dem System.Windows.Forms Namespace für einen Service zu verwenden...
 
Zurück
Oben