2013-01-07 10 views
6

Powiel możliwe:
Load an EXE file and run it from memory using C#Jak uruchomić pobrany plik z pamięci?

używam klasy WebClient, aby pobrać plik .exe z serwera WWW. Czy istnieje sposób, aby uruchomić .exe bez zapisywania go na dysku?

Dla kompletności, pokażę ci, co mam do tej pory.

Oto kod używam, aby rozpocząć pobieranie:

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

A w metodzie (webClient_DownloadDataCompleted) Ja po prostu chwyć bajtów z parametru E:

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

dziękuję.

+0

Czy to exe .NET? –

+0

Nie jestem pewien. Mój program nie może przyjąć żadnych założeń dotyczących typu .exe. –

+0

Ogólny przypadek jest objęty duplikatem wraz z wyjaśnieniem, dlaczego należy go przechowywać i uruchamiać z dysku. –

Odpowiedz

2

Jeśli Twój .exe jest programem .NET, możesz load an assembly and run its entry point.

W przeciwnym razie, podczas there are ways to do it, nie widzę problemu z zapisaniem pliku w katalogu tymczasowym i jego uruchomieniem, co jest o wiele mniej bolesne.

+0

Tak. Zapisanie go w katalogu temp systemu jest prawdopodobnie tym, co w końcu zrobię. –

+0

@Jan: Jeśli masz taką opcję, zdecydowanie idź z tym. Uruchamianie dowolnego pliku PE nie jest łatwą rzeczą, jak widać. –

1

Zobacz ten wątek. Myślę, że można go rozwiązać z VirtualAlloc

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

Jeśli tablica bajt zawiera zespół Net powinieneś być w stanie to zrobić:

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