Benutzer mit den meisten Antworten
Eine fertige VB.NET-Anwendung (*.exe) als Dienst laufen lassen

Frage
-
Hallo zusammen,
ich habe vor einigen Jahren im Web einen Code-Baukasten für VB 6.0 gefunden, mit dem man spielend leicht eine normale VB 6.0 - Anwendung (*.exe) umwandelt in einen echten Windows-Dienst. War wirklich einfach mit dem Rahmengerüst.
So etwas suche ich jetzt für VB.NET.
Hat jemand von Euch so etwas oder weiß, wo ich sowas bekomme?
Meine Anwendung ist komplett fertig, lauffähig, getestet und läuft im Produktivbetrieb.
Sie importiert Emails aus einem POP3-Postfach im Web in eine SQL Server Datenbank.
Wäre schön, wenn wir das Ding als Dienst laufen lassen könnten.
Freue mich auf Input.
Gruß aus Sachsenheim
Thomas
Antworten
-
Hallo Thomas,
ist das eine Konsolenanwendung? Falls nicht, hat die Anwendung irgendein Benutzerinterface (und sei es auch nur eine MessageBox oder ähnliches)? Falls ja, läuft das eh nicht als Dienst, denn wo sollte Windows die Oberfläche der Anwendung anzeigen?
Ich persönlich würde empfehlen, den relevanten Code in ein eigenes Projekt (Klassenbibliothek) auszulagern und ein neues Projekt mit der Vorlage "Windows-Dienst" zu erstellen. Dann einen Verweis auf die DLL des anderen Projekts einfügen und an passender Stelle die Aufrufe durchführen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert tommy_schroeder Montag, 9. Dezember 2013 15:50
Alle Antworten
-
Hallo Thomas,
ist das eine Konsolenanwendung? Falls nicht, hat die Anwendung irgendein Benutzerinterface (und sei es auch nur eine MessageBox oder ähnliches)? Falls ja, läuft das eh nicht als Dienst, denn wo sollte Windows die Oberfläche der Anwendung anzeigen?
Ich persönlich würde empfehlen, den relevanten Code in ein eigenes Projekt (Klassenbibliothek) auszulagern und ein neues Projekt mit der Vorlage "Windows-Dienst" zu erstellen. Dann einen Verweis auf die DLL des anderen Projekts einfügen und an passender Stelle die Aufrufe durchführen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert tommy_schroeder Montag, 9. Dezember 2013 15:50
-
Hallo,
in den letzten Jahren hat sich aber auch einiges getan. Insbesondere sind die Beschränkungen für Windows Dienste angehoben worden, um die Stabilität und Sicherheit zu verbessern, siehe Einführung in Windows-Dienstanwendungen.
Sinnvoller wäre es gewesen gleich eine Dienstanwendung zu erstellen.
Eine Anwendung, die Pop3 verwendet benötigt u. a. Netzwerkzugriff. Dazu solltet Du ein Dienstkonto anlegen oder aber das Network Service Konto verwenden.
Gruß Elmar
- Bearbeitet Elmar BoyeEditor Donnerstag, 5. Dezember 2013 14:16 Link
-
Hallo Stefan,
es ist eine sog. Konsolenanwendung ohne jedes Interface.
Das Programm wird aktuell alle 5 Minuten über den Windows Taskplaner gestartet, es macht dann seinen Job und beendet sich dann selbst wieder.
Es gibt keine Interaktion mit irgendeinem Menschen.
Wir hoffen, dass es als Dienst vielleicht etwas performanter läuft.
Würdest Du sagen, das stimmt?
Gruß
Thomas
-
Hallo Elmar;
es handelt sich um eine Konsolenanwendung, die vollautomatisch Emails von einem POP3-Server im Web holt und in eine SQL Server Datenbank importiert.
Das Programm ist so, wie wir es uns wünschen. Aktuell wird es alle 5 Minuten vom Tasplaner gestartet.
Wäre ein Dienst besser? Ah so, ich vergaß, das Brogrämle protokolliert auch alles, was es tut, in einer Textdatei.
Ach ja, und die Email-Attachments werden im Dateisystem gespeichert.
Wäre toll, wenn ich am Programm selbst nichts ändern müsste. Das Ganze als DLL speichern und dann einfach aus einer "Dienst-Anwendung" starten. Ist es so leicht?
Gruß
Thomas -
Hallo
es gibt zwar ein Programm wie SRVANY, aber das unterstütz neuere Umgebungen nicht wirklich, siehe z. B.: http://stackoverflow.com/questions/845778/what-are-the-pros-cons-of-using-srvany-compared-to-creating-a-windows-service
Das Programm als Dienst laufen lassen bringt eher wenig gegenüber der Aufgabenplanung. Wobei die sich um Dinge wie das Verwendung eines Kontos, die Zeitplanung usw. kümmert, was man beim Dienst selbst tun muss.
Ganz ohne Umschreiben als "richtiger" Dienst geht es somit nicht. Als ersten Schritt würde ich die Kern-Funktionalität in eine Klassenbibliothek auslagern und das Konsolenprogramm darauf verweisen lassen. Daraus kann man den Dienst ableiten und die notwendigen Zusätze implementieren, wie z. B. über einen Threading.Timer das Abholen anzustoßen.
Gruß Elmar
-
Hallo Stefan,
kurzer Zwischenbericht: Ich habe im Web tatsächlich einen "Code-Baukasten" für einen VB.NET-Dienst gefunden.
URL: http://www.vbarchiv.net/tipps/tipp_2204-windows-dienst-in-vb-express-net-einfach-erstellen.html
So, der Dienst läuft, er lässt sich problemlos starten und stoppen. Mein fertiges VB-Programm, das momentan bei uns als Konsolen-exe läuft, konnte ich ohne Probleme in eine DLL umwandeln und in das Dienst-Projekt als externe DLL einbinden. Funzt auch prima. Ich habe unter "onStart" das DLL-Programm aufgerufen und - perfekt !!! - wenn ich den Dienst starte, wird mein Hauptprogramm einwandfrei ausgeführt. Super! Dir schon einmal vielen Dank.
So: Jetzt kommt der letzte Schritt: Ich möchte, dass mein VB-Dienst alle 60 Sekunden das externe Hauptprogramm in der DLL ausführt. Ich weiß, unter VB.NET gibt es auch einen Timer. Kann man den in einem Dienst verwenden?
Gruß
Thomas
-
Hallo Thomas,
freut mich, dass es soweit schon mal läuft.
Bzgl. des Timers schau mal hier:
http://stackoverflow.com/questions/12885013/windows-service-with-timer
In VB.NET sieht das genauso aus, der Code ist nur minimal anders.
Wichtig ist noch, dass Du eine Referenz auf den Timer behältst, sonst wird der irgendwann vom GC entsorgt und es "tickt" nicht mehr :)
http://stackoverflow.com/questions/7513347/system-threading-timer-not-working-in-windows-service
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Tommy,
nichts für ungut die (pre .NET 2.0) Anleitung ist nichts weiter als
Exemplarische Vorgehensweise: Erstellen einer Windows-Dienstanwendung im Komponenten-DesignerGruß Elmar
-
Hallo Elmar, Hallo Stefan,
ich denke, wirklich ich hab's. Der Dienst läuft super performant. Das Kernprogramm habe ich ausgelagert in eine DLL.
Das mit dem Timer sieht ganz gut aus. Hier mein Timer-Code:Imports System.Timers Imports System.Diagnostics Public Class global_variables Public Shared var_timer As System.Timers.Timer Public Shared var_checkintervalseconds As Long End Class
Protected Overrides Sub OnStart(ByVal args() As String) Dim var_eventlog_01 As New System.Diagnostics.EventLog() var_eventlog_01.Source = "Emails importieren" var_eventlog_01.WriteEntry("Der Dienst wurde gestartet.", EventLogEntryType.Information) log.sub_log("Der Dienst wurde gestartet.") global_variables.var_checkintervalseconds = importemails_dll.class_checkintervalseconds.funct_checkintervalseconds Try global_variables.var_timer = New System.Timers.Timer(global_variables.var_checkintervalseconds * 1000) AddHandler global_variables.var_timer.Elapsed, AddressOf mainprogram.sub_mainprogram global_variables.var_timer.Enabled = True global_variables.var_timer.Interval = global_variables.var_checkintervalseconds * 1000 Catch ex As Exception var_eventlog_01.WriteEntry("Es ist ein Fehler aufgetreten: " + ex.Message + " " + Now()) log.sub_log("Es ist ein Fehler aufgetreten 01.") End Try End Sub
Imports System.Timers Imports System.Diagnostics Module mainprogram Public Sub sub_mainprogram(ByVal source As Object, ByVal e As ElapsedEventArgs) Dim var_eventlog_03 As New System.Diagnostics.EventLog() var_eventlog_03.Source = "Emails importieren" Try global_variables.var_timer.Stop() importemails_dll.class_start.funct_start() Catch ex As Exception var_eventlog_03.WriteEntry("Es ist ein Fehler aufgetreten 02: " + Now() + " " + ex.Message) log.sub_log("Es ist ein Fehler aufgetreten 02.") Finally global_variables.var_timer.Start() End Try End Sub End Module
Beobachte das Ganze gerade ein bissel und schicke mir fleißig Emails.