Hi,
ich bin neu hier im Forum und hab gleich die erste Frage.
Undzwar geht es darum, das ich eine Anwendung die ich in mein Programm eingebaut hab mit Parametern Starten möchte. Ich habe es also so Probiert:
string Programmname = "Dateiname.exe";
string Parameter = "parameter";
System.Diagnostics.Process.Start(Programmname, Parameter);
Nun das hat leider nicht geklappt er spukt mir immer einen Error aus die Datei existiere nicht, aber wie soll ich ihm sonst sagen das die Datei bereits in der
Anwendung drin ist?
(Habs über "Vorhandenes Element hinzufügen" einefügt.)
Ich habe gelesen man muss die Datei irgentwie vorher kopieren oder so, aber da ich ja das ohne richtigen Pfad nicht kann, hoffe ich ihr könnt mir helfen 😃
THX!
Guck mal ob dir das weiterhilft:
Hab ich ja auch schon probiert, allerdings ist die Datei ja in keinem Ordner sondern vielmehr in der Datei selbst, so soll es zumindest sein 😃.
Hallo 1mannlan,
wenn die EXE in den Ressourcen eine native EXE ist, musst du sie auf die Platte schreiben, um sie starten (Process.Start) zu können.
Wenn es eine .NET EXE ist, dann kannst du sie aus den Ressourcen als Byte-Array auslesen und das Byte-Array über Assembly.Load laden und dann per Reflection (MethodInfo.Invoke) die Main-Methode starten.
herbivore
Es ist einfach eine Exe, welche ich eingebunden habe(ein Tool).
Ich habe es jetzt manuell hinzugefügt (neue ressource...)
Jetzt ist die Datei auch um 1,1mb größer, wie ich es allerdings anwähle ist mein Problem, mir geht es um den Pfad.
Hallo 1mannlan,
ich habe deine Frage bereits beantwortet.
herbivore
Ich hab das Problem nicht einmal verstanden... 😦
Again what learned...
Ich versuche ja sie auf die Platte zu schreiben, aber womit?
Welchen Pfad hat die Exe wenn sie in den Ressourcen ist?
Die exe ist in die Resourcen eingebettet, oder? Also du hast Add->Existing Item... gemacht? Die wirst du mit Process.Start nicht starten können.
Ist das eine .NET exe? Oder eine x-beliebige Datei?
Falls es eine .NET exe ist, dann könntest du noch versuchen, sie als byte[] aus den Resourcen direkt in den Speicher zu laden und auszuführen. Bin mir nicht sicher, ob das auch mit anderen exe-Files geht.
using System.Reflection;
using System.IO;
Assembly currentAssembly= Assembly.GetExecutingAssembly();
string assemblyRoot = currentAssembly.GetName().Name;
using(Stream res = currentAssembly.GetManifestResourceStream(assemblyRoot + ".NameOf.exe")){
if(res != null && res.Length > 0)
{
byte[] resBuffer = new byte[res.Length];
res.Read(resBuffer, 0, resBuffer.Length);
try{
Assembly exe = Assembly.Load(resBuffer);
exe.EntryPoint.Invoke(null, null);
}catch{}
}
}
Ungefähr so, bin mir nicht mehr 100%ig sicher. Ich glaube aber nicht, dass das mit ner x-beliebigen exe gehen wird, kanns jetzt nicht testen, muss los 😁
Hallo 1mannlan,
Welchen Pfad hat die Exe wenn sie in den Ressourcen ist?
gar keine Pfad, das ist ja das Problem. Eine Ressource hat den Namen, den du selbst (oder VS) vergeben hast (hat). Über diesen Namen kannst du sie auslesen, z.B. mit der ResourceManager-Klasse. Siehe auch Ressourcen in Anwendungen.
herbivore
Dann versuche ich mal meine Frage umzuformulieren, sry das ich mich vielleicht so blöd anstelle.
Ich möchte eben die Datei in ein Verzeichnis aus den Ressourcen kopieren, wenn man sie nicht direkt öffnen kann. Es ist keine .Net datei sondern ein Serverupdate tool.
Ich habe es wie folgt hinzugefügt:
Projekt->Properties->doppelt auf "Resources.resx" ->dann auf Ressource hinzufügen->dropdown auf "Vorhandene Datei hinzufügen"->Datei ausgewählt.
Das ganze sieht dann so aus:
siehe Anhang
Wie ihr seht habe ich die Datei schon versucht zu kopieren, bin aber gescheitert.
Ich bin eben ein Neuling 😐.
Das mit dem Starten kriege ich schon hin, wenn ich sie einmal zum kopieren gekriegt habe.
Hoffe jetzt versteht jeder was ich meine 😃
Hallo 1mannlan,
einfacher geht es wenn Du die Exe nicht als Resource einbindest sondern mit Deiner Applikation in einem Setup-Project weitergibst.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Nunja, ich habs nun aufgegeben und lade die datei einfach per FTP runter, geht mit 2 Zeilen Code, hätte mich eben interresiert wie es geht.
Hi 1mannlan,
das was Du ursprünglich tun wolltest, lässt sich auch mit 3 Zeilen Code lösen:
String myFile = Path.GetTempPath() + "\\StupidAppFromRes.exe";
File.WriteAllBytes(myFile, Properties.Resources.StupidApp);
System.Diagnostics.Process.Start(myFile);
Ein Beispielprojekt hab ich Dir mal angehängt.
Gruß
Ben