Console Application Hide

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von BjöNi.

    Console Application Hide

    Hallo,

    ich möchte für ein programm eine "Hüllenanwendung" schreiben (im folgenden meinen Stub)


    Dieser Stub sorgt dafür, dass eine Anwendung wiederbelebt wird, wenn sie Terminiert (beendet wird, absturz whatever) und sich auch um Aktualisierung der Anwendung kümmert (allgemein die Verfügbarkeit).

    Dazu hab ich mir ´ne Konsolenanwendung geschrieben (der Stub), die dies übernimmt. Diese soll vom Nutzer aber nicht so einfach beendet werden können und auch nicht sichtbar sein (abgesehen von den prozessen, da ist es egal).

    Ist es möglich, das eine Konsole sich selbst invisible macht? Wie Form.Hide in Windows Forms, nur eben für Konsolen-Anwendung...
    Ich will mir nicht unbedingt einen Starter für den Stub schreiben, welcher den Stub invisible startet (mit der Process Klasse, das weis ich wie´s geht), und der Stub wiederrum startet wieder was Sichtbares...

    Hoffe konnte rüberbringen, wo mein problem liegt :/
    Hab im Internet nur Lösungen für Forms gefunden... :<

    Kann da einer helfen?
    Du kannst auch bei Process.Start unter StartInfo WindowStyle.Hidden angeben. Dann musst du nichts umproggrammieren.
    Und warum muss das ne Konsolenapplikation sein, wenn du sowieso nichts in diese schreibst? Dann kannst du den Code doch 1:1 in ne WinForm-Anwendung übernehmen - wo ist das Problem ?(
    Warum sollte ich eine (Rechenintensievere und Ressourcenverbrauchendere) Form nehmen wenns mit einer Console funktioniert? Forms sind nicht das geheimrezept für alles, wie manche hier scheinbar denken. Natürlich kann ich auch ne Form nehmen, aber die Benutze ich eher, wenn es Grafisch ansprechend sein soll und nicht von einem SysAdmin benutzt wird, der benutzt die Dinger eh oft genug. Naja, das ist aber Meinungssache, ich finde hier eine Form völlig oversized, wenn es mit Console gehen könnte, was ich nicht weiß, aber hoffe,

    "Mein bisheriger Code - Nicht refactorisiert"
    Um darzustellen was gemacht werden soll, fehlt noch ein bissl etwas... und ja, mein Englisch ist Mist. Und es wird am Ende refactorisiert, jetzt soll es erstmal laufen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Infer On
    3. Option Compare Binary
    4. Option Explicit On
    5. Imports System.Diagnostics
    6. Module Module1
    7. Sub Main(args() As String)
    8. 'Console.WriteLine(args(0))
    9. 'Console.WriteLine("Usage: <SourcesFolder> <SourceTarget> <RestartApplication[0 or 1]>")
    10. System.Diagnostics.ProcessHandler.StartApplication("notepad.exe")
    11. Do
    12. If Not System.Diagnostics.ProcessHandler.CheckProcessIsLive("notepad.exe", False) Then Exit Do
    13. 'System.Threading.Thread.Sleep(5000)
    14. Loop
    15. End Sub
    16. End Module
    17. Namespace System.Diagnostics
    18. Public Class ProcessHandler
    19. ''' <summary>
    20. ''' Starts a application if this application not alive
    21. ''' </summary>
    22. ''' <param name="fileName"></param>
    23. ''' <remarks></remarks>
    24. Public Shared Sub StartApplication(fileName As String)
    25. ' add .exe for applicationName (neseccary for restart process)
    26. If Not fileName.EndsWith(".exe") Then fileName &= ".exe"
    27. If Not CheckProcess(fileName) Then Process.Start(fileName)
    28. End Sub
    29. ''' <summary>
    30. ''' Checks if a process live, and restart it if it necessary
    31. ''' </summary>
    32. ''' <param name="fileName">application or process to check (.exe will be removed)</param>
    33. ''' <param name="restartApplication">restart application or not</param>
    34. ''' <returns>returns false if the application shut down and not restart</returns>
    35. ''' <remarks></remarks>
    36. Public Shared Function CheckProcessIsLive(fileName As String, restartApplication As Boolean) As Boolean
    37. ' add .exe for applicationName (neseccary for restart process)
    38. If Not fileName.EndsWith(".exe") Then fileName &= ".exe"
    39. ' check if process current running
    40. Dim isAlive As Boolean = CheckProcess(fileName)
    41. If Not isAlive AndAlso restartApplication Then Process.Start(fileName)
    42. ' False zurückliefern, wenn Anwendung beendet und restartApplication = False
    43. Return isAlive Or restartApplication
    44. End Function
    45. ''' <summary>
    46. ''' Überprüft anhand des fileNames, ob ein bestimmter Prozess läuft (entfernt Pfad-Informationen und .exe zur Überprüfung)
    47. ''' </summary>
    48. ''' <param name="fileName"></param>
    49. ''' <returns></returns>
    50. ''' <remarks></remarks>
    51. Private Shared Function CheckProcess(fileName As String) As Boolean
    52. ' trim app path for find out real apllication name
    53. Dim applicationPath() As String = fileName.Split("\"c, "/"c)
    54. Dim lastId As Integer = applicationPath.Count - 1
    55. ' find out process name of application and check if process is running
    56. Dim processName As String = applicationPath(lastId).Remove(applicationPath(lastId).IndexOf(".exe"))
    57. Return IsProcessRunning(processName)
    58. End Function
    59. ''' <summary>
    60. ''' Überprüft, ob ein bestimmter Prozess läuft
    61. ''' </summary>
    62. ''' <param name="processName">Name des Prozesses, welcher überprüft werden soll</param>
    63. ''' <returns></returns>
    64. ''' <remarks></remarks>
    65. Private Overloads Shared Function IsProcessRunning(processName As String) As Boolean
    66. For Each proc As Process In Process.GetProcesses()
    67. If (proc.ProcessName.Contains(processName)) Then Return True
    68. Next
    69. Return False
    70. End Function
    71. ''' <summary>
    72. ''' Überprüft, ob ein bestimmer Prozess läuft
    73. ''' </summary>
    74. ''' <param name="processId">Prozess-Id des Prozesses, welcher überprüft werden soll</param>
    75. ''' <returns></returns>
    76. ''' <remarks></remarks>
    77. Private Overloads Shared Function IsProcessRunning(processId As Integer) As Boolean
    78. For Each proc As Process In Process.GetProcesses()
    79. If proc.Id = processId Then Return True
    80. Next
    81. Return False
    82. End Function
    83. End Class
    84. End Namespace

    Wie geagt, in der Main kommen noch ein paar Sachen hinzu... (ist am Ende auch für Update o.ä. zuständig)
    Ich hab mich mit dem leider auch nicht so wirklich auseinandergesetzt.
    Erstelle sonst ein Projekt als Windows-Dienst (auszuwählen bei neues Projekt) (vorausgesetzt du hast KEIN express).

    Hier werden 2 Methoden zum Start generiert (OnStart(arsg()) und OnStop)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Den müsste ich dann aber hosten, oder?
    Dann bräuchte ich aber wieder eine Hüllenanwendung.

    Das ganze soll dazu dienen, dass ein Benutzer sich nur den Stub aus dem Netzwerk zieht (kleine exe), diese selber ausführen kann und der Stub kümmert sich drum, dass das eigentliche Programm auf deinem Rechner landet, diese Aktuell ist, immer läuft und der Stub auch immer selbst startet.

    Um den Dienst zu hosten (oder vom Laien am Büro-Rechner gehostet zu werden) benötigt es entweder einen Admin der entsprechenden Einrichtung oder wieder eine Anwendung, die den Dienst hostet.
    Dann habe ich eine Anwendung, diese hostet einen Dienst, welcher wiederum eine Anwendung hostet... irgendwie... viel, oder?

    Vor allem ist eben wichtig das es auf jedem Rechner im Netzwerk problemlos auch von einem Laien ausgeführt werden kann, sprich er doppelklickt die Stub, die er im Freigegebenen Ordner findet und der rest erledigt sich von selbst...
    Du könntest deine Anwendung ohne das "Anwendungsframework" starten,
    eine Console lässt sich dann noch über die "kernel32.dll" manuell einbringen.

    Hab ein Beispiel als Anhang hochgeladen, vielleicht kannst du es ja gebrauchen.
    Hoffe ich habe das Thema nicht missverstanden.

    LG.L
    Dateien
    Ich vermute, es ist eine WinForm-Anwendung, dessen Form aber nicht gestartet wird, sehe ich das richtig?

    Aber es scheint estwas zu sein, was tatsächlich helfen könnte... :>
    Danke schonmal.

    Scheint zu Funktionieren... also hat funktioniert. Hab dann aber probiert was passiert wenn ich einfach die Form lösche, ging auch... bis mir dann in der Assembli aufgefallen ist das es als Form angelegt ist und du einfach die StartUp geändert hast. Auf die Idee bin ich nicht gekommen.

    Nutze deinen Code jetzt nicht, sondern hab meine Consolen-Application auf WinForms geändert, und da keine Form da ist muss da auch nichts gemacht werden. Der Code ist also der selbe wie vorher, außer das ich meine WriteLines entfernen musste ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kagurame“ ()

    Genau, im Grunde ist die Windows Formsanwendung gewählt, aber durch das deaktive "Anwendungsframework" lassen sich Modul Subs als Einstiegspunkt auswählen.
    Eine Form wird nie geladen, die kannst du im Verzeichnis auch löschen, das hatte ich vergessen.


    LG.L
    @Lawliet: Ist das das gleiche, wie wenn ich unter "Neues Projekt" auf "Visual Basic" -> "Windows" -> "Leeres Projekt" gehe?
    Müsste das selbe sein, danach erstellst du ein neues "Modul" Dokument .
    In den Projekt Eigenschaften nimmst du das Harken bei "AnwendungsFramework" weg.
    und wählst deinen Einstiegs Sub.

    Hab grad nochmal nachgeguckt: Wenn man "leeres Projekt" auswählt, wird weder eine unnötige Form hingeneriert noch kann man Anwendungsframework überhaupt aktivieren (Checkbox deaktiviert) - siehe Bild:
    Dann müsstest du aber ein Startobjekt festlegen können, sobald du ein Modul erstellt hast mit einem Public Einstiegs Sub.

    //Edit, Ein bestimmter Namespace Import sollte dir das Anwendungsframework ermöglichen.

    LG.L