Hi an alle,
hab mal wieder ein kleines Problemchen,
ich hab mir nen dienst Programiert, mit installerklasse,
des installieren funktioniert auch wunderbar blos wenn ich
ihn starten will bekomme ich die Fehlermeldung
"Dienst 'Softwareerfassung' wurde auf 'Lokaler Computer' gestartet
und dan angehlten. Einige Dienste werden automatisch angehalten, wenn
sie sich im Leerlauf befinden, wie z.B. Leistungsprotokoll- und Alarmdienste."
Der Dienst läuft auf nen Win2003 Server mit .NET2.0
die onStart methode sieht so aus
protected override void OnStart(string[] args)
{
try
{
MessageBox.Show("Beginn!");
MySQLConfig = servconf_abfrage.abfrage(Programmpfad);
MessageBox.Show("Ende");
}
catch (Exception ex)
{
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "(Error:" + ex.Message + ")");
//OnStop();
}
timer_hauptintervall.Enabled = true;
}
vor beenden der Startmethode wird ein teimer mit dem intervall von einer Halben stunde gestartet
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Versuch mal base.OnStart() am Ende aufzurufen, ansonstem musst du warscheinlich noch nen anderen Thread starten. In der Msdn gibt es dazu einige Beispiele.
Bei Diensten kopier ich mir immer den Code aus der MSDN-Lib zu ServiceBase und passe ihn dann an. Dort wird auch die WinAPI-Funktion SetServiceStatus benutzt...
also mit den anhang base.OnStart() klapts auch net ich poste jetzt mal alles in der hoffnung das ihr nen fehler endeckt komm nämlich sonst nimmer weiter mit meinen Projekt.
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;
using System.IO.Compression;
using System.Runtime.InteropServices;
using System.DirectoryServices.Protocols;
namespace softwareerfassung
{
public partial class Softwareerfassung : ServiceBase
{
public Softwareerfassung()
{
InitializeComponent();
}
#region variablen
//Variablen
private ArrayList vorhandene_rechner_tabellen = new ArrayList();
private ArrayList MySQLConfig = new ArrayList();
private ArrayList AngemeldeteRechner = new ArrayList();
private ArrayList updateRechner = new ArrayList();
private ArrayList neueRechner = new ArrayList();
private ArrayList ID = new ArrayList();
private ArrayList Rechner_Programme = new ArrayList();
private string datum1, datum2, log_ordner = Environment.SystemDirectory.Substring(0, 2) + "/Programme/Softwareerfassung/Logs/" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + "/";
private string Programmpfad = Environment.SystemDirectory.Substring(0, 3) + @"Programme\Softwareerfassung\";
private int a;//hilfsvariable
private DataSet DSsoftwareverwaltung = null;
private DataSet DSsoftwareverwaltung_eigenschaften = null;
private DataSet Mom_Rechner = null;
private DataSet Mom_pcsoftlist = null;
private object[] Rechner_Programme_obj = new object[2];
private DataRow[] RowArray;
private DataRow[] mom_rechner_array = new DataRow[1];
private object[] mom_rechner_programmedaten;
#endregion
protected override void OnStart(string[] args)
{
base.OnStart(args);
try
{
MySQLConfig = servconf_abfrage.abfrage(Programmpfad);
}
catch (Exception ex)
{
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "(Error:" + ex.Message + ")");
OnStop();
}
timer_hauptintervall.Enabled = true;
}
protected override void OnStop()
{
this.timer_hauptintervall.Enabled=false;
this.timer_hauptintervall.Interval=1;
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "Dienst wurde angehalten!");
log_class.log_eintragen(log_ordner, "log.txt","");
log_class.log_eintragen(log_ordner, "log.txt", "");
}
protected override void OnPause()
{
base.OnPause();
this.timer_hauptintervall.Enabled = false;
this.timer_hauptintervall.Interval = 1;
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "Dienst wurde pausiert!");
log_class.log_eintragen(log_ordner, "log.txt", "");
log_class.log_eintragen(log_ordner, "log.txt", "");
}
protected override void OnContinue()
{
base.OnContinue();
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "Dienst pausiertrung wurde aufgehoben!");
log_class.log_eintragen(log_ordner, "log.txt", "");
log_class.log_eintragen(log_ordner, "log.txt", "");
timer_hauptintervall.Enabled = true;
}
protected override void OnShutdown()
{
base.OnShutdown();
this.timer_hauptintervall.Enabled = false;
this.timer_hauptintervall.Interval = 1;
log_class.log_eintragen(log_ordner, "log.txt", DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond + " - " + "Dienst wurde Beendet!");
log_class.log_eintragen(log_ordner, "log.txt", "");
log_class.log_eintragen(log_ordner, "log.txt", "");
}
private void timer_hauptintervall_Tick(object sender, EventArgs e)
{
MessageBox.Show("ich bin ein timer");
}
}
}
ich arbeite mit VS2005 fals des was hilft
danke für eure hilfe
gruß aus franken
ps ich hab auch mal nen ganz banalen dienst programiert der mir beim start ne MessageBox bringt und beim beenden eine, der brachte den gleichen fehler, mein vorgehen wahr so:
-Neues Projekt, dorten dienst Projekt ausgewählt
-dann hab ich ja die grundstrucktur von nen dienst ja scho da
-dann installer hinzugefügt und erstellt
-dann mit installutil.exe installiert
hab des mit msdn Hilfe gemacht da gabs ein tutorial für dienste.
nachma danke
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Hi!
Du scheinst ja irgendwo einen Fehler zu haben, wie ja aus Deinem ersten Post ersichtlich wird. Ich wuerde Dir mal raten, Deinen Dienst, so wie er jetzt ist, zu starten, sodass wieder die Fehlermeldung kommt. Lass den Fehler durchkommen, d.h. verwende kein "try-catch". Nun muesstest Du in der Systemsteuerung unter Administrative Tools einen Event Viewer haben (Weiss nicht genau wie sich dieser auf Deutsch nennt; arbeite mit einem englischen System). Dort wirst Du nun drei Eintraege finden: Applikation, Sicherheit und System. Ich bin mir nicht mehr ganz sicher, aber Du wirst entweder unter Applikation oder unter System Deine eigentliche Fehlermeldung finden. Das wirst Du relativ einfach daran erkennen koennen, da unterschiedliche Events ueber Typ, Datum, Zeit, Name der Applikation etc. identifiziert werden koennen. Anhand dieser Infos wirst Du schnell Deinen Service und somit den Fehler finden koennen.
Falls es geholfen hat, dann sag noch kurz mal Bescheid, damit ich weiss, dass ich das nicht falsch in Erinnerung hatte.
Gruss, DaMoe
Hast du zufällig mal meinen Hinweis mit SetServiceStatus beachtet? Scheinbar nicht. Kopier einfach den Code und passe ihn an.
Folgendes. Dein Dienst wird beendet, weil kein Thread mehr vorhanden ist der Arbeitet. Also du musst noch eine Tätigkeit implementieren. Bei Dir wäre das der Timer der in einen Seperaten Thread per Sleep implementiert wird.
SetServiceStatus hab ich persönlich noch nie gerufen, braucht man an sich auch nicht.
Weiterhin ist es heutzutage nicht mehr üblich MSGBOX'en zu zeigen. Wenn ich Einstellungen für einen Thread treffen (Sind ähnlich den Standard) funktioniert das sowieso nicht mehr. Ein Fenster richtig aus einem Service heraus anzuzeigen ist eigentlich eine Kunst für sich und benötigt weit aus mehr code.
Dein Bsp. benötigt eigentlich keinen Dienst sondern "muss" mit einer versteckten Anwendung realisiert werden.
hi die MSGBOX soll nur nen code symbolisieren,
ich weis das es leichter ist als versteckte anwendung (hab des prog scho komplet fertig als window anwendung)
ich benötige aber einen dienst das ist die voraussetzung,
wie sähe das aus wenn ich den timer in einen anderen thread implementire,
bzw. wo kann ich so was nachlesen.
(also so soll des ablaufen, der admin drückt auf start in der dienstverwaltung, meine start methode soll ne datei auslehsen und nen timer starten mehr net)
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Ein fach einen Thread OnStart starten und die Funktion dazu sieht wie folgt aus:
void Execute()
{
while(lRunning) // Globale Variable die anzeigt ob sich der Dienst beenden soll
{
Thread.Sleep(1000);
DoSomething();
}
}
OnStart-> Initialisiertung des Threads und Starten
OnShutdown -> Thread Beenden und warten bis er beendet ist (an TimeOut denken)
OnPause -> Thread.Suspend oder besser eine zweite Boolsche Variable einführen. Über sinn und Unsinn lässt sich da je nach anwendungsfall entscheiden.
ok danke ich probier des mal aus
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Hi,
Erstens:
Original von Borg
Hast du zufällig mal meinen Hinweis mit SetServiceStatus beachtet? Scheinbar nicht. Kopier einfach den Code und passe ihn an. ⚠ ⚠ ⚠
Zweitens: [Tutorial] Windows Services mit C#
Drittens:
private System.Threading.Timer timer = null;
private Semaphore consumerSemaphore = new Semaphore(0,1);
protected override void OnStart(string[] args)
{
// jede Minute servant() ausführen
timer = new System.Threading.Timer(new TimerCallback(servant),null,0,60*1000);
// Thread starten, der den Dienst am Leben hält
Thread workingThread = new Thread(new ThreadStart(consumer));
workingThread.Start();
}
private void servant(object stateInfo)
{
...
if (sollBeenden)
this.consumerSemaphore.Release();
}
private void consumer()
{
// zum beenden auf die Semaphore warten
this.consumerSemaphore.WaitOne();
...
}
Gruß
dN!3L
VIELEN VIELEN VIELEN dank an euch alle, es geht,
besonders an dich dN!3L des hat mir super geholfen,
hab des tutorial schon duchrgelesen wurde aber nicht ganz schlau draus g
wahr scho a weng spät,
so jetzt funzt zwar der timer mein problem ist aber nun vollgendes ich hab in VS2005
eine MySQL DLL eingebunden übern Projektmappen-Explorer und
mit using MySql.Data.MySqlClient; bekannt gemacht.
In meiner windowanwedung geht des wunderbar jetzt hab ich ein setup-projekt angehängt an mein dienst-projekt da erkent er auch den verweis auf die dll und schmeist die mit ins setup wenn ich nun des setup starte entpackt er mir die dateien (also meine exe fürn dienst und meine MySQL DLL) in einen Ordner.
nun muss ich ja weil des setup den dienst nicht gleich installiert hat den dienst mit installutil.exe installieren dan findet er aber die MySQL DLL nimmer.
Jetzt meine Frage: was muss ich in meinem Code verändern damit ich die DLL finde.
Fals es nützlich ist mein dienst benutzt für sein logfile und andere Quellen einen festen ordner der sich nie ändert.
tut mir leid das ich so viel frage bin aber noch in der ausbildung und mein Lehrer is auch net grad ein Genie in C#, der hat so was noch nie gemacht.
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Also bei mir klappt das prima mit dem Installieren. Die DLLs werden auch gefunden.
Hast du deinem Projekt einen ServiceInstaller und einen ServiceProcessInstaller hinzugefügt? Ziemlich gut in WindowsService Installieren beschrieben. Oder mal unter http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_24_002.htm gucken.
Ansonsten Wie poste ich richtig? Punkt 1.1 und 1.3 😉
Gruß
dN!3L
hi ich hab einen installer hinzugefügt des programm dan erstelt dan ein setup projekt drangehangen und dem mein dienst hinzugefügt,
dan des Setup erstellt dan hab ich ja net setup.exe und ein msi packet wenn ich nun des setup ausführen speichert er mir meine exe vom dienst und meine dll in einen ordner jetzt könnt ich den dienst mit installutil.exe installieren aber des will ich ja nicht er soll des direkt installieren wenn möglichst mit der dll weil wenn ich in mit installutil.exe installiere findet er die dll nimmer.
hab mir die links angeschaut haben mir aber nicht weitergeholfen,
hab auch den dienst schon veröffentlicht und versucht mit der da entstandenen setup.exe zu installieren aber dan hab ich blos im startmenu nen eintrag der auf meine dienst.exe verweist und wenn ich da drauf klick sagt er mir ich soll mit installutil.exe erst den dienst installieren.
ich will ja nur das der nach installutil.exe meine dll trotzdem noch findet
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(
Was ein Dienst grundsätzlich ist, weißt du?
_ :rtfm:Informationen über Dienste_
Die kompilierte ausführbare Datei, die von einem Dienstanwendungsprojekt erstellt wird, muss auf dem Server installiert werden. Erst dann kann das Projekt sinnvoll funktionieren.[...] Ein Dienst kann nicht direkt ausgeführt werden [...]. Stattdessen muss der Dienst installiert und gestartet werden.
Also die Assembly, die dein Dienst ist, kannst du natürlich nicht so per Doppelklick starten. Ist ja ein Dienst. Und das sagt dir die Meldung auch, du sollst das Dingens nämlich als Dienst installieren (mit installutil.exe) und nicht die Exe starten.
Wie beschrieben, hast du schon den Dienst installiert (via Setup) und musst das installutil nicht mehr benutzen. Also gehst du in die Diensteübersicht (Systemsteuerung>Verwaltung>Dienste), suchst da deinen Dienst (der Name ist der im ServiceInstaller unter "DisplayName"), Doppelklick drauf und dann "Starten" klicken (oder du änderst "StartType" [vom ServiceInstaller] in "Automatic").
Gruß
dN!3L
ja des ist mir scho klar des mitn installieren, das der nicht so ausführbar ist,
das ist es ja eben ich hab des ding zwar installiert aber im dienstexplorer taucht der dienst nicht auf, ich bekomme nur einen verweis im startmenü,
aber des mitn installieren is ja nicht mehr mein problem des klapt ja alles jetzt,
mein problem ist ich hab die MySQL DLL bei mir im dienst eingebunden und wenn ich den dienst installiere und starte findet er sie nicht mehr.
Jetzt wollt ich wissen was ich da machen muss damit er sie findet
ps: freilich weis ich was ein dienst ist
So fals ihr Rechtschreibfehler endeckt dürft ihr Sie gerne behalten 😁
Bin nämlich legastheniker und hab von denen genügend X(