Laden...

[gelöst] WindowsService-Installation schlägt fehl

Erstellt von hipp1010 vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.157 Views
H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren
[gelöst] WindowsService-Installation schlägt fehl

Hi,

habe mit einen Rahmen für mein neues Programm (WindowsService) geschrieben. Doch leider geht die Installation mit installUtil.exe schief. Habe mir etliche Berichte im Inetrnet dazu angesehen, doch haben mich diese nicht weitergbracht.

Installer-Klasse ist vorhanden:


using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;

namespace dynamicFOCUSservice
{
    [RunInstallerAttribute(true)]
    class WindowsServiceInstaller : Installer
    {
        ServiceProcessInstaller serviceProcessInstaller;
        ServiceInstaller serviceInstaller;

        /// <summary>
        /// Public Constructor for WindowsServiceInstaller.
        /// - Put all of your Initialization code here.
        /// </summary>
        public WindowsServiceInstaller()
        {    
            //# Service Account Information
            serviceProcessInstaller = new ServiceProcessInstaller();
            serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
            serviceProcessInstaller.Username = null;
            serviceProcessInstaller.Password = null;

            //# Service Information
            serviceInstaller = new ServiceInstaller();
            serviceInstaller.DisplayName = "myTaskmanager";
            serviceInstaller.Description = "Task-Dienst der Anwendung <myApplication> zur Durchführung der Generierung von Reports.";
            serviceInstaller.StartType = ServiceStartMode.Manual;
            //# This must be identical to the WindowsService.ServiceBase name
            //# set in the constructor of WindowsService.cs
            serviceInstaller.ServiceName = "myScheduler service";

            this.Installers.Add(serviceProcessInstaller);
            this.Installers.Add(serviceInstaller);
        }
    }
}

Folgende Fehlermeldung bekomme ich:

Fehlermeldung:
...
Keine öffentlichen Installer mit dem RunInstallerAttribute.Yes-Attribut in der Assembly E:\myService\myService\obj\x86\Release\myService.exe gefunden.
Die InstallState-Datei wird entfernt, da keine Installer vorhanden sind.
...

Hat jemand eine Idee?

Gruß Hipp

16.842 Beiträge seit 2008
vor 11 Jahren

Unsere Forensuche mit dem Treffer auf Installation eines Dienstes funktioniert nicht hat Dir nicht geholfen?

Interessant für Helfer ist bei solch einem Fall auch immer die Angabe des Betriebssystems.

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Nein der Thread hat mir nicht geholfen. Anhand des Codes kann man sehen, dass es eigentlich korrekt sein sollte.
Betriebssystem ist WIN7 32Bit. Erstellt unter VS 2010 Express.
Habe eine leere Anwednung erstellt und den Source hineinkopiert. Das ganze habe ich als KonsolenAnwendung definiert (Windows-Anwendung oder Klassenbibliothek machen wohl keinen Sinn)

Hier noch der Code der Service-Klasse:


using System.Diagnostics;
using System.ServiceProcess;
using System.Timers;

namespace dynamicFOCUSservice
{
    class WindowsService : ServiceBase
    {
        //private System.ComponentModel.IContainer components;
        private System.Timers.Timer timer1;

        public WindowsService()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Initiqalize service and events
        /// </summary>
        private void InitializeComponent()
        {
            this.ServiceName = "dynamicFOCUS scheduler service";
            this.EventLog.Log = "dynamicFOCUS scheduler";

            this.CanHandlePowerEvent = true;
            this.CanHandleSessionChangeEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;

            timer1 = new System.Timers.Timer(10000);
            timer1.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        }

        /// <summary>
        /// The Main Thread: This is where your Service is Run.
        /// </summary>
        static void Main()
        {
            //WindowsServiceInstaller myInstaller = new WindowsServiceInstaller();
            //ServiceBase.Run(new WindowsService());

            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { new WindowsService() };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }

        /// <summary>
        /// Dispose of objects that need it here.
        /// </summary>
        /// <param name="disposing">Whether
        ///    or not disposing is going on.</param>
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }

        /// <summary>
        /// OnStart(): Put startup code here
        ///  - Start threads, get inital data, etc.
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            EventLog.WriteEntry("dynamicFOCUSservice scheduler startet.");
            timer1.Enabled = true;
            base.OnStart(args);
        }

        /// <summary>
        /// OnStop(): Put your stop code here
        /// - Stop threads, set final data, etc.
        /// </summary>
        protected override void OnStop()
        {
            EventLog.WriteEntry("dynamicFOCUSservice scheduler stopped.");
            timer1.Enabled = false;
            base.OnStop();
        }

        /// <summary>
        /// OnPause: Put your pause code here
        /// - Pause working threads, etc.
        /// </summary>
        protected override void OnPause()
        {
            EventLog.WriteEntry("dynamicFOCUSservice scheduler paused.");
            timer1.Enabled = false;
            base.OnPause();
        }

        /// <summary>
        /// OnContinue(): Put your continue code here
        /// - Un-pause working threads, etc.
        /// </summary>
        protected override void OnContinue()
        {
            EventLog.WriteEntry("dynamicFOCUSservice scheduler continued.");
            timer1.Enabled = true;
            base.OnContinue();
        }

        /// <summary>
        /// OnShutdown(): Called when the System is shutting down
        /// - Put code here when you need special handling
        ///   of code that deals with a system shutdown, such
        ///   as saving special data before shutdown.
        /// </summary>
        protected override void OnShutdown()
        {
            base.OnShutdown();
        }

        /// <summary>
        /// OnCustomCommand(): If you need to send a command to your
        ///   service without the need for Remoting or Sockets, use
        ///   this method to do custom methods.
        /// </summary>
        /// <param name="command">Arbitrary Integer between 128 & 256</param>
        protected override void OnCustomCommand(int command)
        {
            //  A custom command can be sent to a service by using this method:
            //#  int command = 128; //Some Arbitrary number between 128 & 256
            //#  ServiceController sc = new ServiceController("NameOfService");
            //#  sc.ExecuteCommand(command);

            base.OnCustomCommand(command);
        }

        /// <summary>
        /// OnPowerEvent(): Useful for detecting power status changes,
        ///   such as going into Suspend mode or Low Battery for laptops.
        /// </summary>
        /// <param name="powerStatus">The Power Broadcast Status
        /// (BatteryLow, Suspend, etc.)</param>
        protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
        {
            return base.OnPowerEvent(powerStatus);
        }

        /// <summary>
        /// OnSessionChange(): To handle a change event
        ///   from a Terminal Server session.
        ///   Useful if you need to determine
        ///   when a user logs in remotely or logs off,
        ///   or when someone logs into the console.
        /// </summary>
        /// <param name="changeDescription">The Session Change
        /// Event that occured.</param>
        protected override void OnSessionChange(SessionChangeDescription changeDescription)
        {
            base.OnSessionChange(changeDescription);
        }

        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            System.Diagnostics.EventLog event1;
            event1 = new System.Diagnostics.EventLog();
            event1.Log = "Application";
            event1.Source = "dynamicFOCUS scheduler service";

            event1.WriteEntry("dynamicFOCUS scheduler check queedd tasks");
        }
    }
}

Habe das [RunInstallerAttribute(true)] gesetzt. Trotzdem wird es nicht gefunden?

Gruß Hipp

T
111 Beiträge seit 2005
vor 11 Jahren

Hallo

mach einmal Dein Service und den Installer public, dann sollte es funktionieren.

Thomas

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

OH man. Danke. Hab den Wald vor lauter Bäumen nicht gesehen.

Installation bestens. Doch jetzt die Meldung:

Fehlermeldung:
Dienst "myService" wurde auf "Lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automatisch angehalten, wenn sie nicht von anderen Diensten oder Programmen verwendet werden.

Ziel dieses Dienstes soll sein, dass ich mit dem integrierten Timer auf eine DB zugreife und dann spezielle Aktionen ausführe.

Oder muss ich über den Dienst ein externes Programm aufrufen, dass dann eben diese Aktionen durchführt?

Gruß Hipp

T
111 Beiträge seit 2005
vor 11 Jahren

Hallo

Das geht schon, Du must nur den Benutzer unter dem der Dienst gestartet wird auch auf die DB berechtigen. Ich habe dazu einen eigenen User angelegt und diesem den Dienst und der DB zugewiesen.

mfg Thomas

30 Beiträge seit 2007
vor 11 Jahren

Hallo,

mir fällt auf, dass du das Eventlog von deinem Service unterschiedlich definiert hast.

InitializeComponent()
..
this.EventLog.Log = "dynamicFOCUS scheduler";

und

OnTimedEvent(..)
..
event1.Log = "Application";

Der ServiceInstaller erstellt dir das Eventlog ggfs. automatisch und er meldet auch die Quelle an, in deinem Fall also ein benutzerdefiniertes LOG mit dem Namen "dynamicFOCUS scheduler" und dem Quellennamen "dynamicFOCUS scheduler service".
Der Start des Services funktioniert damit dann auch.
Beim ersten TimerElapsed-Event versuchst du aber mit dem gleichen Quellennamen ins Log "Application" zu schreiben.
Ich vermute mal, dass dadurch eine Exception geworfen wird, und da du die nicht behandelst, beendet sich das Programm.

Viele Grüße

Jens

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

@Thomas.at:

Danke. Aber noch habe ich keien Zugriff auf eine DB. Es ist ja lediglich der Timer an, der eine Zeile ins LOG schreiben soll.

@jbrand:

Danke. War wieder blind.

Doch hat das alles noch nichts geholfen. Er startet den Dienst und beendet ihn sofort mit der gleichen Meldung.
Deswegen die Frage: Muss ich ein externes Programm starten, damit der Dienst aktiv bleibt? Ich würde eher nicht vermuten. Also warum krepiert mir der Service dauernd ??? ?(

Gruß Hipp

1.696 Beiträge seit 2006
vor 11 Jahren

Hallo,

steht was im Eventlog? Pack mal try & catch rein und schaue mal wasfür Exception es auswirft.

Außerdem, was macht es für einen Sinn, alle 10 sek. einen Eintrag in das Eventlog reinzuhauen? Eine Datei ist vielleicht besser dafür geeignet, oder?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Hi,

das mit dem Timer ist ja nur ein Test. Normalerweise wird in der DB nachgesehen, welcher Task als nächstes ansteht. Dann der Timer entsprechend gesetzt und bei Eintritt dieser zeit ein Programm gestartet.

Dienst läuft jetzt, aber nur weil ich folgendes geändert habe:


public class WindowsService : ServiceBase
    {
        //private System.ComponentModel.IContainer components;
        private System.Timers.Timer timer1;
        private EventLog eventLog;

        public WindowsService()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Initiqalize service and events
        /// </summary>
        private void InitializeComponent()
        {
            this.ServiceName = "dynamicFOCUS scheduler service";
            
            WriteEventTolog("Initialize");

            this.CanHandlePowerEvent = true;
            this.CanHandleSessionChangeEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;

            timer1 = new System.Timers.Timer(10000);
            timer1.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        }
        ...
}

Methode ausgelagert:


        private void WriteEventToLog(string logEvent)
        {
            eventLog = new System.Diagnostics.EventLog();
            eventLog.Log = "Application";
            eventLog.Source = "dynamicFOCUS scheduler service";

            ((System.ComponentModel.ISupportInitialize)(eventLog)).BeginInit();
            if (!EventLog.SourceExists(eventLog.Source))
            {
                EventLog.CreateEventSource(eventLog.Source, eventLog.Log);
            }
            ((System.ComponentModel.ISupportInitialize)(eventLog)).EndInit();

            eventLog.WriteEntry(logEvent, EventLogEntryType.Information);
        }

Aber das logging der einzelnen events geht irgendwie nicht:


        protected override void OnStart(string[] args)
        {
            WriteEventToLog("dynamicFOCUSservice scheduler startet.");
            timer1.Enabled = true;
            base.OnStart(args);
        }

Hier auch nicht:


        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            WriteEventToLog("dynamicFOCUS scheduler check next tasks");
        }

Wo liegt hier das Problem?

H
hipp1010 Themenstarter:in
79 Beiträge seit 2011
vor 11 Jahren

Hi,

habe es gelöst. Eigentlich hat alles funktioniert, ich habe nur nicht im richtigen protokoll nachgesehen. War in "SYSTEM", es muss aber "APPLICATION" sein.