Entwickler-Ecke

Verteilte Systeme - Anwendung updaten


Csharp-programmierer - Mo 15.02.16 17:53
Titel: Anwendung updaten
Hallo ihr Experten.

Ich habe nun eine Webseite, auf der man meine Programme kostenlos downloaden kann. Nun habe ich einen kleinen Fehler gefunden. Aber ich kann ja jetzt von meinen Kunden nicht immer verlangen, dass sie sich bei jedem kleinsten Update eine neue .exe herunterladen, und die alte Version löschen. Gibt es irgendeine Variante, dass man einen Update Button hinzufügt und die Anwendung sozusagen automatisch geupdatet wird.

Ich habe mal irgendwo ganz viele .dll Dateien gesehen und da stand Anwendungserweiterung. Vielleicht irgendwie sowas?


Th69 - Mo 15.02.16 20:03

Hallo,

wie groß ist denn deine Anwendung, d.h. besteht sie aus mehr als der EXE (d.h. DLLs, Configs, Resources etc.)?

Die Suche nach Auto-Updater für .NET hat mich u.a. zu folgenden Komponenten geführt:
AppUpdater [https://appupdater.codeplex.com/]
NetSparkle [http://netsparkle.codeplex.com/]
wyBuild [http://wyday.com/wybuild/]

Früher hatte ich auch einen anderen Updater verwendet - dieser wird aber leider nicht weiter supportet ;-(


Csharp-programmierer - Mo 15.02.16 23:17

Wie kann ich mir diese Software vorstellen? Braucht der Benutzer meiner Software dann auch diese Software oder wie funktioniert das?


hydemarie - Di 16.02.16 03:16

wyBuild kannst du zum Beispiel einfach mitliefern.


Csharp-programmierer - Di 16.02.16 16:02

Also gibt es die Möglichkeit, dass ich in das neue Projekt einen Aktualisieren Button reinbaue. Ich muss dann nur dieses Plugin mitliefern oder wie? Dann als .zip oder was?


Ralf Jansen - Di 16.02.16 16:36

Ich vermute schwer das du das nachlesen könntest wie das genau passiert wenn du einfach den Links folgst und das nachliest. Wenn es dann dazu Detailfragen gibt oder du doch eher was anderes möchtest DANN könne wir gern helfen. Das bißchen selbst schlau machen solltest du aber erstmal machen.


Csharp-programmierer - Di 16.02.16 20:01

Oder wenn ich mich zurück erinnere, hat man ja in Visual Studio die Möglichkeit, sein Projekt zu veröffentlichen. In diesem Ordner befindet sich ja eine Update Datei. Kann man die nicht irgendwie mitbenutzen, da dieses Plugin nur 21 Tage kostenlos ist.


Talemantros - Mi 17.02.16 12:48

Hey,
ich hatte mir seinerseits einen Updater aus folgendem Projekt angepasst.
Ich habe es ohne das Updatefenster gemacht, so dass die Anwendung beim Start nach einem Update sucht und dieses automatisiert startet.
http://www.codeproject.com/Articles/265751/Application-Auto-update-via-Online-Files-in-Csharp

Eine Exe. die du mitlieferst.
Diese beendet deine Anwendung und zieht sich ein zip von einem FTP und entpackt und verschiebt die Dateien etc.

Gruß
Daniel


Csharp-programmierer - Mi 17.02.16 18:24

Welche Version muss ich mir davon downloaden? Demoproject oder?
Und diese .exe muss ich dann mitliefern?


Christian S. - Mi 17.02.16 18:40

Hallo,

ich möchte dich hiermit bitten, etwas mehr Eigeninitiative zu zeigen.

Verlinkt ist ein längerer Artikel, der so ziemlich alles erklärt, was Du brauchst. Bitte versuche diesen zu lesen und anzuwenden. Und wenn dann spezifische Fragen sind, kannst Du sie gerne hier stellen.

Viele Grüße
Christian


Csharp-programmierer - Mo 22.02.16 18:29

Ich habe mir nun dieses Projekt gedownloadet und versucht den Code auf der Webseite in meinem Projekt einzufügen, was aber nicht funktioniert.


hydemarie - Mo 22.02.16 18:32

Was funktioniert denn nicht?


Csharp-programmierer - Mo 22.02.16 20:27

Also wenn ich die URL Eingebe, den Namen der Anwendung und die Version. Und wenn ich den Code der Webite (von dem Updater) in VS eingebe, wird fast alles rot markiert


Csharp-programmierer - Sa 12.03.16 23:49

Ich habe jetzt die .dll von NetSparkle über Projekt -> Verweise... hinzugefügt. Aber wie kann ich meine Anwendung nun updaten?
Geht das auch über Mediafire (weil ich dort meine Projekte hochlade) oder braucht man dafür einen extra Server irgendwie?


Greenberet - So 13.03.16 12:07

Ich habe für solche Zwecke immer gerne ClickOnce [https://msdn.microsoft.com/de-de/library/142dbbz4%28v=vs.90%29.aspx] benutzt. Man muss nichts extra herunterladen und kann alles über Visual Studio regeln lassen.


Csharp-programmierer - Mo 21.03.16 22:11

Ich habe mich jetzt über ClickOnce informiert, wie ich dieses Projekt veröffentliche.
Ich habe mir dazu ein Tutorial angesehen, aber der YouTuber hat statt C: im Pfad \localhost... eingegeben. Die hab ich auch gemacht, aber irgendwie ist der Pfad falsch. Ich denke mal, weil ich noch kein FTP-Server habe.

Meine Frage also: 1)wie erstelle ich mir einen FTP-Server (ich habe es schon mit FileZilla versucht, jedoch finde ich das Programm viel zu unübersichtlich)

2) Funktioniert das Updaten auf anderen PC dann auch? Oder nur auf dem Entwicklerpc?

Ich hoffe ihr könnt mir helfen. Bis jetzt lade ich eine neue .exe auf Mediafire hoch. Meiner Meinung nach ist das sehr unprofessionell und ich denke mal, viele meiner potentiellen User downloaden sich meine Software aus diesem Grund nicht. Ich hoffe so sehr, dass wir dieses Problem zusammen lösen können :)


Csharp-programmierer - Di 22.03.16 16:05

Also ich habe mir nun wieder FileZilla heruntergeladen. Wenn ich den Server testen möchte, komme ich über die Website nicht rein. Also Hostname habe ich 12345 angegeben.

Würde es gehen, dass man diese Anwendung über FilaZilla veröffentlicht?


Th69 - Di 22.03.16 16:13

Hast du überhaupt einen Server, der mit dem Internet verbunden ist?
Von wem wird denn deine Webseite gehostet? Und kannst du dort Software installieren?


Csharp-programmierer - Di 22.03.16 16:31

Nein. Eine Website habe ich nicht über diesen Server.
Wenn ich FileZilla starte, kommt dort dieser Text:


Quelltext
1:
2:
3:
4:
5:
6:
7:
FileZilla Server 0.9.56 beta
Copyright 2001-2016 by Tim Kosse (tim.kosse@filezilla-project.org)
https://filezilla-project.org/
Connecting to server [::1]:12345...
Connected, waiting for authentication
Logged on
Warning: FTP over TLS is not enabled, users cannot securely log in.


Dort habe ich aber ein Ordner hochgeladen, der die Dateien von einem Testprojekt enthält.

Gibt es vielleicht eine andere Möglichkeit als FTP-Server? Mann kann die Dateien ja in einem Ordner veröffentlichen lassen. Und dort ist dann auch eine Setup-Datei. Geht das irgendwie, dass ich auf Mediafire dann den neuen Ordner hochlade und die Anwendung dann automatisch geupdatet wird?


Ralf Jansen - Di 22.03.16 17:34

Zitat:
Gibt es vielleicht eine andere Möglichkeit als FTP-Server? Mann kann die Dateien ja in einem Ordner veröffentlichen lassen. Und dort ist dann auch eine Setup-Datei. Geht das irgendwie, dass ich auf Mediafire dann den neuen Ordner hochlade und die Anwendung dann automatisch geupdatet wird?


Zweifelhaft. Was geht und was nicht solltest du aber eher direkt den Hoster fragen.
Zweifelhaft weil wenn du fürs hosten nix zahlst und die Downloader auch nicht wo ist da das Geschäftsmodel für den Hoster? Das mindeste ist das sich ein Downloader beim downloaden Werbung anguckt und das passt nicht zu Ftp.

Zitat:
Dort habe ich aber ein Ordner hochgeladen, der die Dateien von einem Testprojekt enthält.


[::1] ist dein eigener Rechner. Dein ~hochladen~ hat deinen Rechner also nicht verlassen.


Csharp-programmierer - Di 22.03.16 17:48

Ich bin der Meinung, dass man für meine aktuellen Programme kein Geld verlangen kann. Und ist der FTP-Server nicht kostenlos?

Ich musste vorher immer eine Version 1.1 als .exe uploaden. Meine User dann auch. Wenn ich die Software weiterentwickelt habe, musste ich Version 1.1 löschen und 1.2 hochladen. Dann müssen meine User wieder die andere .exe downloaden und die andere löschen.
Das wirkt auf micht nicht sehr professionell und ich denke, damit ruiniere ich meinen Ruf, wenn die User immer so einen Weg gehen müssen, um auf dem neuesten Stand meiner Software zu sein.

Zitat:
Ich habe für solche Zwecke immer gerne ClickOnce benutzt. Man muss nichts extra herunterladen und kann alles über Visual Studio regeln lassen.


Also habe ich mich über ClickOnce informiert. Es gibt ja dort 3 Wege. Über eine CD, über eine Website oder über Website.
Auf YouTube habe ich gefunden, wie er den Pfad in VS eingibt aber statt C: hat er \localhost eingegeben, Dies habe ich auch gemacht, aber es funktionierte nicht.

Letzendlich bin ich auf der Suche nach einer Lösung, wie man eine bestehende Version einfach upgraden kann, ohne solchen Aufwand wie oben genannt zu betreiben.


Ralf Jansen - Di 22.03.16 18:05

Zitat:
Ich bin der Meinung, dass man für meine aktuellen Programme kein Geld verlangen kann. Und ist der FTP-Server nicht kostenlos?


Ein Server braucht Strom und Stellfläche warum solltem man dir das kostenlos anbieten? Werbung ist das Geschäftsmodel dieser Hoster und Ftp würde es umgehen. Aber wie gesagt ob es sowas wie Ftp gibt solltest du deinen Hoster fragen.

Zitat:
Das wirkt auf micht nicht sehr professionell und ich denke, damit ruiniere ich meinen Ruf, wenn die User immer so einen Weg gehen müssen, um auf dem neuesten Stand meiner Software zu sein.


Ohne Kosten (hier bezogen auf dich nicht dein ~Kunden~) professionell wirken ist grundsätzlich schwierig.


Csharp-programmierer - Di 22.03.16 18:14

Okay. Ich merkt schon, es wird schwierig mit dem automatischen Updaten. Bei dem Server musste ich aber keine Bankverbindungen usw angeben. Keine Ahnung, dann bleibt es halt bei der anderen Methode :(

Zitat:
Ohne Kosten (hier bezogen auf dich nicht dein ~Kunden~) professionell wirken ist grundsätzlich schwierig.

Ich verstehe schon die Grundlage dieses Satzes. Mit professionell meine ich meine Programme/Website.


Th69 - Mi 23.03.16 11:23

Wenn du eine EXE hochladen kannst, kannst du dann auch eine Textdatei hochladen?
Dann könntest du darin die aktuelle Versionsnummer deines (zuletzt hochgeladenen) Programms abspeichern und der Client (d.h. dein Programm selbst) würde dann diese Textdatei herunterladen und die Version vergleichen. Und dann den Anwender über das Update informieren und/oder die neue Programmversion herunterladen.

Also genau das, was in dem bereits verlinkten Application Auto-update via Online Files in C# [http://www.codeproject.com/Articles/265751/Application-Auto-update-via-Online-Files-in-Csharp] beschrieben ist...


Csharp-programmierer - Mi 23.03.16 14:10

Die Textdatei hochladen iszt kein Problem.

Zitat:
Also genau das, was in dem bereits verlinkten Application Auto-update via Online Files in C# beschrieben ist...


Hab ich schon versucht. Ich habe ja einen Account bei Mediafire. Brauch man für die Anwendung von ihrem Link nicht einen FTP-Server?


Ralf Jansen - Mi 23.03.16 14:23

Zitat:
Brauch man für die Anwendung von ihrem Link nicht einen FTP-Server?


Nein. Wenn du dir den Screenshot dort anschaust steht da vor der url http nicht ftp ;)
Das Problem bleibt aber das gleiche. Dein Hoster muß den direkten Zugriff via diesem Protokol erlauben. Egal ob http oder ftp.

Soweit ich die AGB [http://www.mediafire.com/policies/terms_of_service.php] von MediaFire verstehe ist das nicht erlaubt/möglich. Habe aber weder Erfahrung mit Mediafire noch irgendwas ausprobiert. Ob du das darfst würde ich weiterhin am ehesten den Hoster selbst fragen.


Csharp-programmierer - Sa 16.04.16 10:56

Also ich habe nun eine andere Methode gefunden. Über den WebClient die Anwendung zu downloaden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private void button2_Click(object sender, EventArgs e)
        {
            WebClient webclient = new WebClient();
            Uri uri = new Uri(this.textBox1.Text);
            webclient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownLoadCompleted);
            webclient.DownloadFileAsync(uri, "MaiLet.exe");
        }

        private void DownLoadCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Erfolg");
        }


Die Anwendung wird zwar in dem Ordner mir 95kb angezeigt. Wenn ich diese Datei aber öffnen möchte, dann steht dort, diese App kann auf meinem PC nicht ausgeführt werden. Woran liegt es nun?

Der Downloadlink: http://www.mediafire.com/download/4aghbty25ec7859/MaiLet+Schuldenverwaltung.exe


Christian S. - Sa 16.04.16 11:39

Dein Downloadlink verweist auf eine Webseite, also wird es wohl die sein, die Du herunterlädst. Dein Programm ist ja auch keine 95kb groß.


Csharp-programmierer - Di 19.04.16 14:20

Zitat:
Dein Downloadlink verweist auf eine Webseite, also wird es wohl die sein, die Du herunterlädst. Dein Programm ist ja auch keine 95kb groß.


Das war es. Ich habe nun auf meiner Website Dateien, die ich über den WebClient automatisch downloaden kann. Was gerade perfekt funktioniert ist der Impuls an den User, dass ein neues Update verfügbar ist.
Wenn der User dieses Update installieren möchte, wird auch die neue .exe heruntergeladen. Hier ist das Problem: die heruntergeladene Anwendung hat den selben Namen wie die Anwendung, die gerade läuft. Wie funktioniert es, dass die neue Version automatisch installiert wird und der User nichts machen muss?


Christian S. - Di 19.04.16 14:58

Hallo,

da wirst Du über eine separate Anwendung gehen müssen, nennen wir sie "Updater".

Der Vorgang wäre dann so:
  1. Deine Hauptanwendung lädt die neue Version herunter (unter anderem Namen, sie kann sich ja nicht selbst überschreiben).
  2. Dann startet Deine Hauptanwendung die Updater-Anwendung und beendet sich selbst (so lange sie läuft, kann sie nicht aktualisiert werden).
  3. Die Updater-Anwendung wartet, bis Deine Hauptanwendung sich beendet hat (Prozessliste überwachen!) und überschreibt dann die alte Hauptanwendung mit der heruntergeladenen Datei.
  4. Dann startet Dein Updater wieder die (nun aktualisierte) Hauptanwendung und beendet sich selbst.

Grüße
Christian


Ralf Jansen - Di 19.04.16 15:53

Oder deine Anwendung lädt den Installer runter wenn der Installer komplett herunter geladen ist wird dieser von der Anwendung gestartet und deine Anwendung beendet sich.

Der Installer sollte so geschrieben sein das es damit umgehen kann sollte also eins oder mehrere der folgenden Dinge tun
- prüfen das die Anwendung auch beendet ist bevor es fortsetzt
- oder die Anwendung abschießen falls die noch läuft
- oder den Start des eigentlichen Installers soweit verzögern das die Anwendung auch garantiert beendet ist. Also z.B. durch einen Begrüßungsbildschirm oder Userinteraktion


Csharp-programmierer - Di 19.04.16 16:07

Also ich habe jetzt folgenden Code zusammengebastelt.
Auf der Hauptanwendung im Load Event:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
try
                    {
                        WebClient web = new WebClient();
                        Uri uri = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/webstudio_version.txt");

                        web.DownloadFile(uri, "Version.txt");

                        string newVersion = null;
                        string currentVersion = null;

                        using (StreamReader reader = new StreamReader(Path.Combine(Application.StartupPath, "CurrentVersion.txt")))
                        {
                            currentVersion = reader.ReadToEnd();
                            reader.Close();
                        }
                        using (StreamReader reader = new StreamReader(Path.Combine(Application.StartupPath, "Version.txt")))
                        {
                            newVersion = reader.ReadToEnd();
                            reader.Close();
                        }

                        if (newVersion != currentVersion)
                        {
                            Uri description = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/webstudio_beschreibung.txt");
                            WebClient client = new WebClient();
                            client.DownloadFile(description, "Beschreibung.txt");
                            string _description = "";
                            using (var file = new StreamReader(Path.Combine(Application.StartupPath, "Beschreibung.txt")))
                            {
                                _description = file.ReadToEnd();
                                file.Close();
                            }

                            Updater updater = new Updater(newVersion, _description);
                            updater.ShowDialog();
                        }


Der Updater:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
try
            {
                var url = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/mailet_webstudio_2016.exe");
                var newUrl = new Uri(@"http://mailet-software.weebly.com/uploads/7/2/0/5/72054763/webstudio_version.txt");
                var client = new WebClient();

                File.Delete(Path.Combine(Application.StartupPath, "MaiLet Webstudio 2016.exe"));
                client.DownloadFile(url, "MaiLet Webstudio 2016.exe");
                client.DownloadFile(newUrl, "CurrentVersion.txt");

                System.Diagnostics.Process.Start(Path.Combine(Application.StartupPath, "MaiLet Webstudio 2016.exe"));
                Application.Exit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


Das funktioniert. Aber wenn die Hauptanwendung gestartet wird, wir das Fenster angezeigt, dass den User mitteilt, dass es ein neues Update gibt. Was mich hier wundert ist, dass die WinForm nach dem ALTEN Layout programmiert ist, obwohl ich in den ZIP die neue .exe der Hauptanwendung gepackt habe.


Csharp-programmierer - Di 19.04.16 16:32

Ich habe vergessen, die neue Anwendung auf den Server zu laden :rofl: :rofl: :rofl: :rofl:
Naja jetzt funktioniert es :)