2014-11-02 75 views
1

從我的C#程序中,我試圖直接從內存中執行包含另一個.NET可執行文件(一個C#控制檯應用程序)的byte [],並且不接觸磁盤。如何使用C#在內存中執行.NET控制檯應用程序?

我知道這裏有張貼類似的問題,也對如何做到這一點像一些好文章這一個:

http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory

然而,他們都遇到了同樣的問題,他們的工作,但僅用於在內存中執行Windows Forms應用程序,但是當我嘗試執行控制檯應用程序時,它不起作用。例如:

byte[] FileBytes = File.ReadAllBytes("C:\\MyTestProgram.exe"); // just for testing purposes 

Assembly a = Assembly.Load(FileBytes); 
MethodInfo m = a.EntryPoint; 
m.Invoke(a.CreateInstance(m.Name), null); 

而當'MyTestProgram.exe'是Windows窗體時,它可以完美執行。但是,當「MyTestProgram.exe」是一個控制檯應用程序,它返回以下錯誤:

「未處理的異常:System.Reflection.TargetParameterCountException:參數數量不匹配」

請注意,控制檯應用程序不接收任何參數,所以這是奇怪...

任何幫助將是非常讚賞:)

+4

像往常一樣'Main'方法有一個'string [] param'參數。你不用'Invoke'調用它,但你應該。 – 2014-11-02 17:13:31

+0

感謝您的超快速幫助,但是如何使Invoke調用考慮控制檯應用程序Main方法的string []參數? – samsam 2014-11-02 17:18:51

+0

@samsam:您可以閱讀「Invoke」的文檔以獲得開始。不那麼難,真的。 – siride 2014-11-02 18:04:59

回答

2

主要方法是靜態的,你並不需要通過Invoke一個實例。你要這樣稱呼它:

var parameters = m.GetParameters().Length == 0 ? null : new[] { new string[0] }; 
m.Invoke(null, parameters); 

該代碼同時處理Main()Main(string[] args)變化。

+0

@samsam查看編輯答案。 – brz 2014-11-02 17:52:36

+0

!!!驚人的是它現在像一個魅力。你真的在那裏做了一些很棒的魔術:D謝謝你! – samsam 2014-11-02 17:58:16

相關問題