2013-01-07 9 views
6

Mögliche Duplizieren:
Load an EXE file and run it from memory using C#So führen Sie eine heruntergeladene Datei aus dem Speicher aus?

ich die WebClient-Klasse bin mit einem .exe von einem Webserver herunterzuladen. Gibt es eine Möglichkeit, die .exe auszuführen, ohne sie zuerst auf der Festplatte zu speichern?

Zum Zweck der Vollständigkeit lassen Sie mich Ihnen zeigen, was ich bisher habe.

Hier ist der Code, den ich den Download zu starten verwenden:

WebClient webClient = new WebClient(); 
webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadDataCompleted); 
webClient.DownloadDataAsync(new Uri("http://www.somewebsite.com/calc.exe")); 

Und in der (webClient_DownloadDataCompleted) Methode, die ich einfach das Bytes aus dem Parameter e greifen:

private void webClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) 
{ 
    Byte[] downloadedData = e.Result; 
    // how to run this like a .exe? 
} 

Danke.

+0

Ist es eine .NET-exe? –

+0

Ich bin mir nicht sicher. Mein Programm kann keine Annahmen über den Typ von .exe machen. –

+0

Generischer Fall ist durch Duplikat mit Erklärung abgedeckt, warum Sie speichern und von der Festplatte ausführen müssen. –

Antwort

2

Wenn Ihr .exe ein .NET-Programm ist, können Sie load an assembly and run its entry point.

Andernfalls während there are ways to do it, ich sehe das Problem nicht mit einer Datei im temporären Verzeichnis speichern und von dort ausgeführt, die so viel weniger schmerzhaft.

+0

Ja. Es ist wahrscheinlich, was ich am Ende tun werde, es in das Systemtemp-Verzeichnis zu speichern. –

+0

@Jan: Wenn Sie solche Option haben, gehen Sie auf jeden Fall mit. Das Ausführen einer beliebigen PE-Datei ist nicht einfach, wie Sie sehen können. –

1

Schauen Sie sich diesen Thread an. Ich denke, dass Sie es mit VirtualAlloc

Is it possible to execute an x86 assembly sequence from within C#?

lösen können Wenn Ihr Byte-Array enthält eine .NET-Assembly sollten Sie in der Lage sein, dies zu tun:

Assembly assembly = AppDomain.Load(byteArray) 
Type typeToExecute = assembly.GetType("ClassName"); 
Object instance = Activator.CreateInstance(typeToExecute);