Ich habe einige UI-Anwendung, die in der Taskleiste des Benutzers lebt, die in C# geschrieben wird. Die EXE für das Tool wird bei einer Reihe von Projekten, die es verwenden, in unser Quellcodeverwaltungssystem eingecheckt, sodass wir die Version, mit der sie ausgeführt werden, aktualisieren können, indem Sie die aktualisierte EXE einchecken.Wie kann ich ein Programm aus dem Speicher in C# starten?
Das Problem ist, dass wenn die Benutzer die neueste Revision der EXE erhalten, das Programm oft ausgeführt wird, und die Synchronisierung auf ihrem Computer fehlschlägt. Ich möchte es reparieren, so dass das Programm die exe und alle abhängigen DLLs nicht blockiert, wenn es läuft, damit sie synchronisieren können, ohne das Programm herunterfahren zu müssen.
Zur Zeit habe ich ein Programm, das eine ausführbare Datei als Parameter nimmt und es aus dem Speicher startet, indem der Inhalt der Assembly im Speicher vorgelesen wird. Unglücklicherweise versagt dies vollständig, wenn es um die DLLs geht, die das Programm benötigt.
Der Code habe ich jetzt wie folgt aussieht etwas:
public class ExecuteFromMemory
{
public static void Main(string[] args)
{
//Figure out the name of the EXE to launch and the arguments to forward to it
string fileName = args[0];
string[] realArgs = new string[args.Length - 1];
Array.Copy(args, 1, realArgs, 0, args.Length - 1);
//Read the assembly from the disk
byte[] binary = File.ReadAllBytes(fileName);
//Execute the loaded assembly using reflection
Assembly memoryAssembly = null;
try
{
memoryAssembly = Assembly.Load(binary);
}
catch (Exception ex)
{
//Print error message and exit
}
MethodInfo method = memoryAssembly.EntryPoint;
if (method != null && method.IsStatic)
{
try
{
method.Invoke(null, new object[] { realArgs });
}
catch(Exception ex)
{
//Print error message and exit
}
}
else
{
//Print error message and exit
}
}
}
Meine Frage ist, bin ich etwas total blöd tun? Gibt es einen besseren Weg, damit umzugehen? Wenn nicht, was sollte ich tun, um den Umgang mit externen Abhängigkeiten zu unterstützen?
Zum Beispiel kann der obige Code keine abhängigen Dateien laden, wenn Sie versuchen, "Foo.exe" auszuführen, die Funktionen aus "Bar.dll" verwendet, die "Foo.exe" wird überschreibbar sein, aber "Bar. dll 'ist immer noch gesperrt und kann nicht überschrieben werden.
Ich habe versucht, die Liste der referenzierten Assemblys von der 'GetReferencedAssemblies()' Methode auf dem geladenen assmebly zu bekommen, aber das scheint keinen Hinweis darauf zu geben, wo die Assembly geladen werden soll ... Muss ich suchen für sie selbst? Wenn ja, was ist der beste Weg, dies zu tun?
Es scheint, als wären andere Leute schon einmal darauf gestoßen, und ich möchte das Rad nicht neu erfinden.
- Aktualisierung: Die EXE wird eingecheckt, weil wir unsere internen Tools so an die Teams verteilen, die sie verwenden. Es ist nicht optimal für diesen Anwendungsfall, aber ich habe nicht die Möglichkeit, diese Richtlinie zu ändern.
Und warum möchten Sie aus dem Speicher ausführen? Dies ist ein guter Weg, um Ihr Programm Live-Virus aussehen zu lassen. – Migol