Laden...

Embedded Resource mehrmals nutzen

Erstellt von Paul01 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.878 Views
P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren
Embedded Resource mehrmals nutzen

Hallo Zusammen,

folgende Problemstellung:

Ich habe eine Exe in die Resourcen gelegt & und kann diese auch erfolgreich aus meiner GUI aus aufrufen.

Das sieht dann in etwa so aus:

  try
            {
              
                string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Test.exe");
                File.WriteAllBytes(path, Patcher.Properties.Resources.Test);
                Process.Start(path);
            }
            catch
            {
                MessageBox.Show(String.Format("Die Datei {0} existiert nicht.", "Es ist ein Fehler aufgetreten."), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }

Nun habe ich aber ein Problem. Undzwar möchte ich die Resource mehrmals starten..
Wenn ich also diese Test.exe aus meiner Gui heraus aufgerufen habe und diese nochmal starten möchte, springt mein Programm in den Catch.

Nun zur Fragen. Ist es überhaupt möglich eine Resource mehrmals zu verwenden?
Muss diese dann irgendwie bei jedem Aufruf "kopiert" werden?

Freue mich über jede Antwort!

Danke

16.835 Beiträge seit 2008
vor 6 Jahren

Klassischer Fall für [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Ansonsten sei gesagt, dass man so keine Exceptions behandelt.
Wenn Du willst, dass eine Fehlermeldung ausgegeben wird, wenn die Datei nicht existiert, dann verwende auch die entsprechenden Methoden dafür: File.Exists in diesem Fall.

Ansonsten kann man auch einfach keine Rechte auf den Pfad haben oder was auch immer für eine Exception auftaucht und Du gibst auch: Datei existiert nicht.
Hilft dem Benutzer so vermutlich nicht.

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

So okey, also ohne try catch.
Bringt mich jz aber nicht bei meiner Frage weiter.
Kenn mich mit c# nicht so gut aus und will deshalb wissen ob das grundsätzlich gar nicht möglich ist eine Ressource zweimal zu starten?
Ich denk da bringt mir auch der Debugger nichts 😃

Hier korrigiert, funktioniert aber so nicht. Was ist da falsch?
Er spring nicht in den Else Zweig aber das Programm crashed.

           
                string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Test.exe");
 if (File.Exists(path))
            {

                File.WriteAllBytes(path, Patcher.Properties.Resources.Test);
                Process.Start(path);
            }
            else
            {
                MessageBox.Show(String.Format("Die Datei {0} existiert nicht.", "Es ist ein Fehler aufgetreten."), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
16.835 Beiträge seit 2008
vor 6 Jahren

Das hat mit der Bezeichnung "Ressource" nichts zutun.
Eine Ressource kann beliebig oft verwendet werden.

Du hast hier aber eine Exe; das kommt natürlich auf die Exe an, ob man diese mehrmals starten darf oder Du diese mehrmals (durch entsprechend andere temporäre Ordner) mehrmals auf das Dateisystem schreiben musst.

Warum das Programm abstürzt wissen wir auch nicht.
Wir können schließlich nicht hellsehen; nur Du hast Zugriff auf Deinen Rechner und auf die entsprechenden Fehlermeldungen (zB. durch den Event Viewer).

Aber bist Du Dir sicher, dass das eine Standalone-Exe ist, oder ob die Exe noch weitere Dateien benötigt, damit sie gestartet werden kann?

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Die Exe ansich benötigt noch andere Dateien um gestartet werden zu können. Diese befinden sich im selben Verzeichnis wie mein Programm.

Wie gesagt, einmal kann ich die Exe ja auch starten nur beim nächsten Mal gehts dann nicht mehr.

Vorher ist das Programm ja nicht abgestürtzt, denke ehr dass das doch mit try catch gemacht wird. Da ist er nämlich direkt ins Catch gesprungen.

Generell, wenn ich die Exe unabhängig von meinem Programm ausführe, kann ich die so oft starten wie ich möchte.

16.835 Beiträge seit 2008
vor 6 Jahren

Die Exe ansich benötigt noch andere Dateien um gestartet werden zu können. Diese befinden sich im selben Verzeichnis wie mein Programm.

string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Test.exe");
if (File.Exists(path))
            {

                File.WriteAllBytes(path, Patcher.Properties.Resources.Test);

Keine Ahnung, was Du da siehst, aber Du schiebst die Text.Exe in ein Verzeichnis, wo eben die anderen Dateien nicht liegen (oder Du zeigst uns den Code dazu nicht).

Vermutlich ist Dein Catch auch nur angesprungen weil Du auf irgendeinen Fehler gelaufen bist, den wir hier auch nicht kennen.
Du fängst die Exception aber gar nicht ab; das solltest Du mal tun und reinschauen.

Wie gesagt: wir sehen hier nicht mehr als Du hier preis gibst.

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Nur zu meinem Verständnis.
Wenn ich die Test.exe in ein anderes Verzeichnis schiebe, wie kann das dann beim ersten Start funktionieren?

Brauch ich da die FileNotFoundException e um die Exception abzufangen?

PS:
Viel mehr Code ist in der Funktion auch nicht drin. Wird nur der Button disabled bzw. enabled

16.835 Beiträge seit 2008
vor 6 Jahren

Also entweder stimmt Deine Beschreibung nicht oder es passiert nicht so, wie Du denkst.

Wenn Du eine Exe in ein Verzeichnis schiebst, in dem sich die benötigten Dateien zur Ausführung nicht befinden, dann kann sie weder beim ersten noch beim 9723. Ausführen erfolgreich gestartet werden.

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Ich schieb doch eig. gar keine Exe in irgend ein Verzeichnis?!

Ich habe ein C# Programm.
Diese C# Programm beinhaltet in seinen Resourcen eine .exe welche mit compilt wird.
Ich lege mein C# Programm in ein Verzeichnis welches die Dateien für die .exe beinhalten.
Ich starte das C# Programm, starte daraus die Exe diese kann ausgeführt werden.
Ich lass das C# Programm offen und starte nochmal daraus die Exe. Exe kann nicht ausgeführt werden, C# Programm crashed.

Bevor ich das mit FileExists eingefügt habe, sprich mit Try Catch, ist er beim zweiten Ausführen in den Cache und hat mir meinen Fehlertext ausgeführt.

Ich möchte wissen, wie ich die Exe mehrmals aus meinem C# Programm startbar machen lassen kann.

Die Exe im C# Programm ist mehrfachausführbar. Getestet indem ich die Exe ohne mein C# Programm mehrmals starte.

Ich hoffe du verstehst jz wo mein Problem liegt und wie ich vorgehe.

16.835 Beiträge seit 2008
vor 6 Jahren

Ich versteh, wo Dein Problem liegt: Du verstehst Deinen Code nicht 😉

Ich schieb doch eig. gar keine Exe in irgend ein Verzeichnis?!

string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Test.exe");
File.WriteAllBytes(path, Patcher.Properties.Resources.Test);

Also hier schiebst Du Bytes, die aus der Ressource Deiner Anwendung stammen, in eine Exe, die sich in einem temporären Verzeichnis befindet.
System.IO.Path.GetTempPath() ist in der Regel das Temp-Verzeichnis in Deinem Benutzerordner.
Eben: C:\Users\UserName\AppData\Local\Temp\Test.exe

Das passt zumindest nicht mit dem überein, was Du hier als Anwendungsfolge beschreibst.
Denn Du sagst, dass diese Exe weitere Dateien für die Ausführung benötigt, die sich im gleichen Ordner befindet, wie die hier ausgeführte Anwendung.
Wenn also Deine Anwendung nicht zufällig in C:\Users\UserName\AppData\Local\Temp\ liegt, dann dürfte das hier nicht funktionieren, sofern Deine Beschreibung korrekt ist.

Welche Fehlermeldung erhälst Du denn?
Das hast Du uns bisher verheimlicht.
Im Startpost hast Du zwar eine Exception gehabt, bei der Du aber angenommen hast, dass dies durch das Nicht-Existieren der Datei kommt; muss aber nicht sein, weil Du hier potentiell jeden Fehler abgefangen und mit entsprechender Fehlermeldung quittiert hast.
Daher der Hinweis:

Du fängst die Exception aber gar nicht ab; das solltest Du mal tun und reinschauen.

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Mein Ablauf stimmt. Beim ersten mal gehts, beim zweiten Mal nicht.
Ich hab jz die Exception mal abgefangen

Fehlermeldung:
"Der Prozess kann nicht auf die Datein C:\Users\User\AppData\Local\Temp\Test.exe zugreifen, da sie von einem anderen Przess verwendet wird.

So, was bedeutet das jz genau?
Punkt a, ich muss dir recht geben, ist mega verwirrend... Die Exe BRAUCHT ZWANGSWEISE 3-4 DLL Dateien. Warum das jz allerdings beim ersten Start funktioniert, kann ich dir nicht sagen.
Tatsache ist, es funktioniert.

Punkt b
Eig, wie schon gesagt, ist die Datei mehrfach ausführbar, deshalb geh ich davon aus das das schreiben von Bytes in die Exe da irgendetwas verändert.

Wie regel ich das jetzt? Im Prinzip muss ich ja dann bei jedem Kick auf den Button ,welcher meine Funktion und somit die Exe ausführt, Die Bytes mit einem neuen Namen zusammenbauen.
Kann man das so sagen?
Wenn ja, wie funktioniert das?
Bzw wie lautet dafür die fachliche Bezeichnung damit ich mich wenigstens erkundigen kann.
Kenn mich in c# nicht so gut aus, deshalb wende ich mich hier auch an dich bzw euch 😉

5.658 Beiträge seit 2006
vor 6 Jahren

Hi Paul01,

die Fehlermeldung ist doch ziemlich eindeutig. Du kannst nicht in die Datei schreiben, während das Text.exe-Programm noch läuft. Beim zweiten Mal brauchst du die Datei ja auch nicht zu erstellen, es würde ausreichen, sich den Pfad zu merken und die vorhandene Datei zu starten.

Bitte beachte zukünftig im eigenen Interesse unbedingt [Hinweis] Wie poste ich richtig?, besonders Punkt 1.1, 2.3 und 5

Weeks of programming can save you hours of planning

16.835 Beiträge seit 2008
vor 6 Jahren

Eben; Du startest hier die Anwendung nicht nur mehrmals; Du versuchst sie auch noch mehrfach zu schreiben.
Daher hatte ich Dich gebeten mehr Code zu zeigen, dann hätte man das sehen können.

Wenn die DLLs fehlen, dann funktioniert höchstens Process.Start() aber nicht die Anwendung selbst.
Oder die Info ist Käse.

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Hallo Sparkel,

ja den Fehler an sich versteh ich schon, nur nicht wie ich ihn beheben kann.
Ich muss ja praktisch das generieren der Exe einfach in den Konstrutor und nur den Prozesstart in die Methode legen oder?

Die Info ist nicht Käse.
Kann dir das gerne demonstrieren 😉

Jz muss ich nur noch schauen wie ich das hinbekomme das der Pfad nur einmal erstellt wird.

5.658 Beiträge seit 2006
vor 6 Jahren

Also du meinst wenn ich die Exe nur einmal "erstelle", sollte das funktionieren?

Gegenfrage: Wieso willst du sie öfter erstellen, als notwendig?

Weeks of programming can save you hours of planning

P
Paul01 Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Ich liebe euch.
Danke für eure Geduld <3

P
441 Beiträge seit 2014
vor 6 Jahren

Auch, wenn das eigentliche Problem gelöst ist, gegenfrage:
Warum kopierst schreibst du die Test.exe und startest sie dann? Wenn du die Sourcen hast und beim Kompiliervorgang die Test.exe sowieso mitkompiliert wird - was spricht dagegen, die Klassen, die jetzt in die Test.exe einkompiliert werden aus deinem Programm direkt anzusprechen?