Update Funktionalität mit C++/CLI und Visual Basic 2010 Frage...


Alex Großmann

Erfahrenes Mitglied
Hallo liebes Forum ;)

Zuerst mal zu meinem Hauptproblem...
Ich mache in ca. 3-4 Monaten meine Abschlussarbeit, die sieht vor das man ein etwas unfangreiches Programm programmiert.
Hierzu sollen auch mind. 1 Themengebiet verwendet werden was noch nicht angelernt wurde... ich spiele nun mit dem Gedanken so etwas wie eine Update Funktionalität einzubauen!

Daher meine Frage: Geht so etwas? Wenn ja, mit welchen Thema müsste ich mich näher befassen? :)

Das 2...
Ich nutze eigentlich Visual Basic 2008, aber da ich mein PC neu aufgesetzt habe, dacht ich mir das ich wohlmöglich mal Visual Basic 2010 probieren könnte. In meiner Berufsschule jedoch geht da die Autovervollständigung nicht?
Also ich mein das kleine Fenster das aufpoppt wenn man z.B. System::{hier dann der PopUp mit den Auswahlmöglichkeiten} ist das in Visual Basic 2010 nicht enthalten ?!

Grüße und VIELEn Dank im Vorraus!
 

sheel

I love Asm
Hi

Falsches Forum. Verschoben.

Natürlich kann man eine Updatefunktion machen, warum denn auch nicht.
Aber was hat das eigentlich mit C++/CLI zu tun? Du willst mit VB.NET programmieren, oder nicht?

Was du dazu brauchst: Irgendeinen Server, der dauerhaft im Internet erreichbar ist.
Ein Webspace, der normalerweise für Webseiten verwendet wird, reicht.
Falls sowas nicht vorhanden ist, müsstest du selbst einen Computer haben,
der immer an und online ist, und Router/DynDNS etc. einrichten.
Bei Bedarf mehr Infos...

Zum Upload selbst:
Stell die aktuelle Programmversion auf den Server, dazu eine Datei mit der Versionsnummer.
Das Programm beim Client überprüft zB. bei jedem Programmstart (wenn es eine Internetverbindung gibt), ob die Nummer in der Versiondatei gleich seiner eigenen Versionsnummer ist. Wenn die in der Datei größer ist: Neue Version Downloaden (HTTP-Klassen anschauen). Die Heruntergeladene Datei ggf. entpacken (Zip oder so).

Da sich ein gestartetes Programm nicht selbst löschen sollte, beim Update auch ein kleines Hilfsprogramm mitgeben, das vom alten Programm gestartet wird.
Das Hilfsprogramm beendet das Alte, löscht es, und verschiebt das Neue an die alte Stelle.
Den Vorgang kann man natürlich auch direkt in das neue Programm implementieren,
zB. wenn es mit -doupdate aufgerufen wird oder so.

Zu der Intellisense-Funktion von VB.NET2010 kann ich leider nichts sagen.

Gruß
 

Alex Großmann

Erfahrenes Mitglied
Vielen Dank Sheel :)

Ich hätte einen Webspace bei Domain Factory, das würde also vollkommen reichen? Was müsste ich den da genau machen? Ne Verbindung vom Programm zum Webhost und dort dann die Version prüfen, reicht da wenn ich ne Datei mit der Versionsnummer aufm Webspace ablege, die über´s Programm einlese und dann wie du geschrieben hast auswerte?!

Danke nochmals :)
 
Zuletzt bearbeitet:

sheel

I love Asm
Ja, DF reicht.

Ich nehm mal an, das Programm besteht nur aus der Exe und braucht sonst keine Dateien.

Zu Tun:
a) Im Code eine int-Variable ProgrammVersion oder so machen, =1
Die bei jeder neuen Version erhöhen

b) Wenn das Programm mit "-update" und einen Dateinamen (also zB."-update prog.exe") aufgerufen wird (das Stringarray von Main überprüfen, ob und was mitgegeben wurde),
dann wird keine GUI etc. angezeigt (kein new-Form() etc.), sondern:

Die prog.exe (oder was als Dateiname eben gekommen ist) löschen.
Wenn nicht löschbar (weil noch an), 100ms warten (Thread.sleep)
und wieder löschen probieren. Schleife, bis es funktioniert hat.

Dann die Datei mit Dateiname Process.GetCurrentProcess().MainModule.FileName kopieren
Zielname der Kopie: prog.exe (oder was mitgegeben wurde.

Dann an den String Dann an den String "prog.exe" (etc.) " -delete" anhängen, und auch
GetCurrentProcess().MainModule.FileName anhängen.

Das Starten.
Und sich selbst beenden.

c) Wenn das Programm mit "-delete" und einen Dateinamen
aufgerufen wird, dann:

Die prog.exe (oder was als Dateiname eben gekommen ist) löschen.
Wenn nicht löschbar (weil noch an), 100ms warten (Thread.sleep)
und wieder löschen probieren. Schleife, bis es funktioniert hat.
Der selbe Löschvorgang wie oben, bei b).

Dann aber nicht kopieren und beenden,
sondern einfach mit dem normalen Programmverlauf (GUI etc.) weitermachen.

d) Beim Programmende (unabhängig vom Start, einfach immer beim Beenden):
Folgende Sachen in ein try-catch, bei dem bei einer Exception
keine Fehlermeldung ausgegeben wird:
Eine version.txt vom Webspace herunterladen (HttpClient.DownloadFile)
und eine Zahl auslesen. Wenn die größer als ProgrammVersion ist:
Auch die Exe Downloadenund mit -update und
Process.GetCurrentProcess().MainModule.FileName starten.

e) Auf den Webspace zwei Dateien rauf:
version.txt mit der Nummer
Und die Exe



Wenn jetzt eine neue Version fertig ist:
Die int ProgrammVersion im Code erhöhen.
Kompilieren
EineVersion.txt mit der neuen Versionsnummer und dem Programmdateinamen machen.
Und beide Dateien auf den Webspace, die Alten also weg.

Das Ganze klingt komplizierter, als es ist.
Wenn du dein Main zeigst, bau ich es ein. Heute nicht viel zu tun.

Den wiederholenden Teil pro Version kann man mit einem Buildskript auch automatisieren,
aber ob das nötig ist...?

Gruß
 

Alex Großmann

Erfahrenes Mitglied
VIELEN Dank Sheel!
Das hört sich echt heftig an! Das ist auch gut so :) Macht sicher was her...
Ich freu mich jetzt schon riesig das um zu setzen, und ich glaube das ich mal ein Beispielprogramm schreiben werde...

Nach was genau muss ich schauen wegen der Verbindung zum Server?
(ich such einfach mal unter den von dir genannten HttpClient :) )
 

sheel

I love Asm
Hast wahrscheinlich schon gefunden,
aber in der MSDN ist die Klasse wie jede Andere beschrieben.

Die Methode DownloadFile macht ihre Aufgabe ganz ohne großes Streamgetue etc. in einer Zeile.
Man kann die Datei auch Streammäßig holen, dann spart man sich die version.txt auf der Festplatte,
aber die schadet nicht...und zum Programmieren ist es dadurch einfacher.
Schreibrechte/Speicher auf der Platte braucht man sowieso für die Exe.
 

Nico Graichen

aka gemballa
Hi

Aber wieso das ganze selbst entwickeln?
ClickOnce bietet genau das!

Und da du bei deiner Abschlussarbeit auch den wirtschaftlichen Nutzen aufzeigen musst, wird es schwierig zu erklären, warum man eine bekannte Lösung nachprogrammiert