Zum Inhalt springen

C# Programm "veröffentlichen"


Empfohlene Beiträge

Geschrieben

Morgen zusammen!

Ich hab folgendes Problem: Meinen Releaseordner hab ich in ein anderes verzeichnis kopiert, von dort aus, können alle User mein Programm aus starten! Jetzt ist es so, wenn ich irgendwelche Änderungen mach, dann muss ich meinen Releaseordner neu in das andere Verzeichnis kopieren und oft geht das nicht, weil dann die Meldung kommt, das es nicht überschrieben werden kann, weil die Zieldatei möglicherweise geöffnet ist!(leuchtet mir ja ein)

Wie kann man sowas umgehen bzw wie macht es ihr das bei änderungen am Programm?!

Ich hoffe jeder hat verstanden was ich meine!

Gruß Veta0208

Geschrieben

Aber dann is doch so, wenn ich Änderungen mache, das die User jedesmal die Dateien rauskopieren müßten und bei 250 User(die zum teil fast keine Ahnung vom Computer haben) ist das ein bisschen schwierig!

oder habs ich nur falsch verstanden!?

Geschrieben

Du könntest eine Update-Funktion einbauen. Dazu muß das Programm immer lokal auf den Rechner des Benutzers gestartet werden. Du lieferst zum eigentlichen Programm ein Update-Programm mit. Das Hauptprogramm überprüft dann beim Start ob ein Update, sprich neue Version im Freigabeverzeichnis, vorhanden ist. Falls ja beendet es sich und startet das Update-Programm, welches wiederum die betreffenden Files lokal durch die neuen aus dem Freigabeverzeichnis ersetzt. Anschließend startet das Update-Programm die eigentliche Anwendung wieder und beendet sich. Ein simples Prinzip :)

Geschrieben

Morgen!

Das Prinzip ist einfach, aber wie soll ich sowas programmieren!? Soviel Ahnung hab ich dann leider doch noch nicht!

Hast du vielleicht schon so etwas gemacht? Dann könntest du es mir evtl. schicken!

Gruß Veta0208

Geschrieben

Ich hab sowas mal in einer anderen Programmiersprache gemacht, aber nicht in C#. Ist aber einfacher in C# :)

Also im Hauptprogramm überprüft du am besten bevor irgendein Formular geladen wurde, ob eine neue Version des Progs im Freigabeverzeichnis vorliegt. Mit Hilfe von System.IO.FileInfo(filePath) (eine Instanz mußt du davon mit new erzeugen) kannst du an das Modifieziert-Datum kommen (LastWriteTime-Eigenschaft). Du vergleichst dann dieses Datum der aktuellen Exe-Datei (System.Windows.Forms.Application.ExecutablePath) mit dem der Executable aus dem Freigabeverzeichnis. Damit lässt sich feststellen, ob die neue Exe-Datei aktueller ist als die derzeitige. Sauberer ist der Vergleich über Versionsnummern, aber das ist glaub ich etwas komplizierter.

Ist eine neue Version vorhanden, dann startest du über System.Diagnostics.Process.Start(path) das Update-Programm, daß sich im selben Pfad befinden sollte wie das Hauptproggi. Direkt danach beendet sich das Hauptprogramm über Application.Exit() selbst.

Die erste Aktion des Update-Programm sollte mit System.Threading.Thread.Sleep(milliSeconds) eine kurze Wartepause sein, damit sich das Hauptproggi auch wirklich beendet hat. Da dies vielleicht immer noch nicht reicht, würde ich zuerst versuchen die Executable mit System.IO.File.Move(source, destination) zu verschieben/umzubenennen. Gibts eine Exception so warte wieder kurz mit Thread.Sleep() und versuche es erneut. Wenn es nach einigen Schleifendurchläufen nicht klappt ist irgendwas schief gelaufen. Ansonsten kannst du jetzt über System.IO.File.Copy(source, destination) die Exe-Datei aus der Freigabe kopieren. Wenn du nicht genau weißt, welche Dateien kopiert werden müssen, dann liste dir alle Dateien aus der Freigabe mit System.IO.Directory.GetFiles(path) auf und kopiere alle Dateien. Wenn es keinen Fehler gab, dann kannste nun die alte verschoben bzw. umbenannte Exe-Datei des Hauptprogramms über System.IO.File.Delete(path) löschen.

Nun starte einfach das neue Programm mit Process.Start(). Danach kann sich das Update-Programm beenden. Soweit ein kurzer Abriss :) Du solltest den Benutzer natürlich vor dem Update informieren was passiert, damit er sich nicht wundert. Hoffe das hilf dir...

Geschrieben

Das hilft mir schon weiter und zum großten Teil versteht ich es ja, aber bei manchen "Sitiuationen" hackts bei mir noch ein bisschen!

Kann du mir villeicht noch ein bisschen Codeschnippsel schicken, vielleicht kann ich mir dann mehr darunter vorstellen!?

Danke aber schon mal für die ganze Mühe!

Gruß Veta0208

Geschrieben

Okay, hier ein Beispiel. Sind 2 Konsolen-Programme. Mußt noch beachten, das in beide die System.Windows.Forms-DLL eingebunden wird. Auserdem mußte vielleicht noch die Pfade anpassen. AnyConsole.exe + UpdateConsole.exe müssen in einem Verzeichnis liegen. Den Pfad für die neue Version musst du entsprechend noch in beiden Programmen anpassen. Es würde sich empfehlen diese Info in eine XML-Config-Datei zu schreiben oder so.

AnyConsole.exe


using System;


using System.IO;

using System.Diagnostics;

using System.Windows.Forms;


namespace AnyConsole

{

	class AnyConsole

	{


		private static string mNewVersionPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), @"..\Release\") + Path.GetFileName(Application.ExecutablePath);


		[STAThread]

		static void Main(string[] args)

		{

			if (UpdateAvailable())

			{

				Process.Start(Path.GetDirectoryName(Application.ExecutablePath) + @"\Update.exe");

				return;

			}


			Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

			Console.WriteLine("Version {0}.{1}.{2}.{3}",

				version.Major,

				version.Minor,

				version.Build,

				version.Revision);	


			Console.ReadLine();

		}


		private static bool UpdateAvailable()

		{


			if (File.Exists(mNewVersionPath))

			{

				FileInfo newVersion = new FileInfo(mNewVersionPath);

				FileInfo curVersion = new FileInfo(Application.ExecutablePath);


				if (newVersion.LastWriteTime > curVersion.LastWriteTime)

				{

					return true;

				}

			}


			return false;

		}


	}

}

UpdateConsole.exe

using System;


using System.IO;

using System.Diagnostics;

using System.Threading;

using System.Windows.Forms;


namespace Update

{

	class UpdateConsole

	{

		[STAThread]

		static void Main(string[] args)

		{

			Thread.Sleep(500);


			UpdateApplication();

		}


		private static void UpdateApplication()

		{

			int count			= 0;

			string targetAppPath		= Path.GetDirectoryName(Application.ExecutablePath) + "\\";

			string targetApp		= targetAppPath + @"AnyConsole.exe";

			string newAppPath		= Path.GetDirectoryName(Application.ExecutablePath) + @"\..\Release\";


			while (count < 10)

			{

				count++;


				try

				{

					File.Delete(targetApp + ".bac");

				}

				catch

				{

				}


				try

				{

					File.Move(targetApp, targetApp + ".bac");

					break;

				}

				catch (Exception ex)

				{

					Console.WriteLine(ex.Message);

				}

			}


			if (count >= 10)

			{

				MessageBox.Show("Error occured");

				return;

			}


			foreach (string filePath in Directory.GetFiles(newAppPath))

			{

				File.Copy(filePath, targetAppPath + Path.GetFileName(filePath));

			}


			Process.Start(targetApp);

		}


	}

}

Jetzt sollte das Prinzip allerdings klar sein :)

Geschrieben

Ja, jetzt hab ichs verstanden! Wenn man das jetzt so anschaut, dann is eh garnicht so schwer!

Aber darauf kommen muss man erst einmal!

Vielen Dank für die ganze Mühe!

Gruß Veta0208

  • 1 Monat später...
Geschrieben

Interessante Thematik. Ich hätte es so gelöst das ich einen ClassLoader programmiere der die benötigten Files erst auf den Client lädt und dann ausführt, das geht auch relativ einfach.

Deine User starten also nur den Class-Loader und der lädt den eigentlichen Code und führt dessen Main-Methode aus. Die Dateien die geladen werden kannst du jederzeit tauschen.

Wenn es ein kleines Tools ist könnte man auch über eine ASP.NET Variante nachdenken.

In Visual Studio 2005 gibt es übrigens eine neue Möglichkeit der Verteilung, hab gerade den Namen vergessen, mit der kannst du die Applikationen über den Browser starten, die werden vorher automatisch auf den lokalen PC kopiert.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...