2014-11-02 50 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

相关问题