2013-01-07 61 views
6

可能重複:
Load an EXE file and run it from memory using C#如何從內存運行下載的文件?

我使用WebClient類下載從Web服務器的.exe文件。有沒有一種方法可以在不首先將其保存到磁盤的情況下運行.exe文件?

爲了完整起見,讓我告訴你我到目前爲止。

這裏是我用來啓動下載的代碼:

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

而且在(webClient_DownloadDataCompleted)方法,我只是抓住從參數e字節:

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

謝謝。

+0

它是一個.NET的exe? –

+0

我不確定。我的程序不能對.exe的類型做任何假設。 –

+0

通用案例覆蓋了重複的解釋爲什麼你必須存儲和從磁盤運行。 –

回答

2

如果您的.exe是一個.NET程序,您可以load an assembly and run its entry point

否則,雖然there are ways to do it,我看不到保存臨時目錄中的文件並從那裏運行它是非常痛苦的問題。

+0

是的。將它保存到系統臨時目錄可能是我最終要做的。 –

+0

@Jan:如果你有這樣的選擇,一定要去用它。正如你所看到的,運行一個任意的PE文件並不是件容易的事情。 –

1

看看這個帖子。我認爲你可以VirtualAlloc

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

解決它,如果你的字節數組包含你應該能夠做到這一點.NET程序集:

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