2016-06-03 7 views
0

Ich habe Code zur Ausführung zur Laufzeit unter Verwendung Form1_Load der Code ist eine einfache Assembly überprüfen, um festzustellen, ob die Version niedriger ist als eine auf einem Server durch Webclient erhalten Version. Von dort aus, wenn seine untere es lädt die neueste EXE und verwendet CMD es umbenennen und es mit dem alten Exe zu ersetzen (Irgendwie funktioniert es während der Anwendung geöffnet ist)VB.NET - Auto-Update-Anwendungen während es geöffnet ist?

Die Themen:

  • Es macht Falsche Anti-Virus-Erkennungen, die versuchen, andere Apps zu infizieren (Trojan Dropper Variant)

  • Es ist in einigen Fällen nicht wirksam (Beispiel: Der Benutzer lädt die App zum ersten Mal herunter und benennt sie in etwas anderes als die Standard-EXE um Name, dann Boom wird es nicht effizient arbeiten)

  • CMD e.t.c ist nicht einmal kann

    wie Schule PC auf einigen Maschinen arbeiten
  • Es ist einfach in der Regel keine gute Idee, CMD zu verwenden.

Was ich will nicht als Lösung tun:

  • einen zweiten Exe-Anwendung mit ihrem einzigen Zweck ist es, die Anwendung der Aktualisierung;

  • CMD Duh

  • Atleast versuchen, nicht Nuget Packages/externe Referenzen aus .dll

  • nicht seinem Code, der nur Updates zu verwenden, wenn der Benutzer auf Ja/OK auf einem MessageBox etc

Was kann ich tun, um dieses Problem der Verwendung von CMD zu lösen?

Mein aktueller Code:

#Region "Update Checker" 

#Region "Test Internet Connection" 

    'Ping Google to see if the user has Internet Connected; 
    Private Function TestInternetConnection() As Boolean 
     Try 
      Dim ping As New Net.NetworkInformation.Ping() 
      ping.Send("google.com") 
      Return True 
     Catch ex As Exception 
      Return False 
     End Try 
    End Function 

#End Region 

#Region "Check for an Update" 

    Private Sub CheckForUpdate() 

     'If the user is Connected to the Internet; 
     If TestInternetConnection() Then 

      Try 

       'Using WebClient, get the Newest File Version; 
       Using wc As New WebClient 

        'Latest Version; 
        Dim LatestVersion As String = wc.DownloadString("http://proxyfuel.xyz/version.txt") 

        'If the Latest Version is Newer then the Current Version; 
        If LatestVersion > Application.ProductVersion Then 

         'Download the Latest Version of the EXE file; 
         wc.DownloadFile("{Application EXE Direct Link}", Application.StartupPath & "\update.exe") 

         'Execute the CMD Batch File to replace the old EXE file with the Newest EXE file; 
         Process.Start(New ProcessStartInfo("cmd.exe", String.Format("/k {0} & {1} & {2} & {3}", "ping -n 3 127.0.0.1 > NUL", "del ""ProxyFuel.exe""", "REN ""update.exe"" ""ProxyFuel.exe""", "start """" ""ProxyFuel.exe""")).WindowStyle = ProcessWindowStyle.Hidden) 

         'Close the Application; 
         Application.Exit() 

        Else 

         'Start Loading the Main Form; 
         My.Settings.updatechecked = True 

        End If 

       End Using 

      Catch ex As Exception 

       'Updating had an Unexpected Error; 
       MessageBox.Show(ex, "Update Error!", MsgBoxStyle.Critical) 

      End Try 

     Else 

      'No Internet Connection - Couldnt connect to the Data Server; 
      MessageBox.Show("Internet Connection Required!", "Error") 

     End If 

    End Sub 

#End Region 

#End Region 
+0

'(Irgendwie funktioniert es, während die Anwendung geöffnet ist)' unmöglich. Vielleicht versagt es still. – Plutonix

+0

@Plutonix Das ist eine Möglichkeit, aber da es nicht wirklich laden zeigen Sie das Formular und schließt die Anwendung etwa zur gleichen Zeit wie es öffnet vielleicht vielleicht nicht – ShinyMK

Antwort

0

Ich habe ähnliche Situationen, in denen ich brauche eine App zu aktualisieren, die derzeit ausgeführt wird. Ich habe eine Zwischenanwendung erstellt, um das Umbenennen (Aktualisieren) durchzuführen. Auf diese Weise kann die Hauptanwendung erfolgreich umbenannt werden, andernfalls wird die Datei für die meisten Dateioperationen gesperrt, wenn die Hauptanwendung noch ausgeführt wird.

  1. Sag mal, mein Haupt-App ist [main] und Updater ist [Updater]
  2. [main] prüft, ob neuere ist Version
  3. [main] wird mit verschiedenen Namen herunterladen [main-new]
  4. [main] laufen [Updater] und schließen/Ausfahrt selbst
  5. [Updater] wird von [Haupt neu] zu [main]
  6. [Updater] auf Erfolg, laufen [main] und schließen/Ausfahrt umbenennen selbst

* Anmerkung: Sie keine Datei umbenennen CMD zu verwenden, zu verwenden:

My.Computer.FileSystem.RenameFile("C:\Test.txt", "SecondTest.txt") 

* von Rename File

Hope this Hilfe.

+0

Oh wow das ist ziemlich praktisch - Aber es gibt eine Möglichkeit, dies mit einer .exe wie vielleicht kombinierst/speicherst/komprimierst du die 2 .exe's in eine und lädst einfach die andere dann benötigt? – ShinyMK

+0

Sie könnten DLL verwenden und laden entladen wie benötigt. Ich denke, dass Sie Ihre .EXE als Launcher entwerfen müssen und so viel möglich Ihre Anwendung in DLL-Module abteilen, wenn irgendeine Revision benötigt wird, aktualisieren Sie nur die DLL. – WindyHen

+0

Gute Idee, aber ich denke, für meine Lightweight-App ist es einfach zu viel Arbeit tun:/ – ShinyMK

Verwandte Themen