Zum Inhalt springen

C# Programm "veröffentlichen"


Veta0208

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...