Laden...

[gelöst] Dienst findet dll nicht

Erstellt von =>- techno_prog -<= vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.385 Views
=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren
[gelöst] Dienst findet dll nicht

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(

849 Beiträge seit 2006
vor 17 Jahren

Versuch mal base.OnStart() am Ende aufzurufen, ansonstem musst du warscheinlich noch nen anderen Thread starten. In der Msdn gibt es dazu einige Beispiele.

B
1.529 Beiträge seit 2006
vor 17 Jahren

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...

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(

D
128 Beiträge seit 2005
vor 17 Jahren

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

B
1.529 Beiträge seit 2006
vor 17 Jahren

Hast du zufällig mal meinen Hinweis mit SetServiceStatus beachtet? Scheinbar nicht. Kopier einfach den Code und passe ihn an.

N
45 Beiträge seit 2006
vor 17 Jahren

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.

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(

N
45 Beiträge seit 2006
vor 17 Jahren

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.

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(

2.891 Beiträge seit 2004
vor 17 Jahren

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

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(

2.891 Beiträge seit 2004
vor 17 Jahren

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

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(

2.891 Beiträge seit 2004
vor 17 Jahren

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

=
=>- techno_prog -<= Themenstarter:in
67 Beiträge seit 2006
vor 17 Jahren

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(