如何使用C#在内存中执行.NET控制台应用程序?

时间:2014-11-02 17:11:00

标签: c# .net

在我的C#程序中,我试图直接从内存执行包含另一个.NET可执行文件(一个C#控制台应用程序)的byte []而不需要触摸磁盘。

我知道这里发布了类似的问题,还有一些关于如何做到这一点的好文章:

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

但是,它们都遇到了同样的问题,它们只能在内存中执行Windows Forms应用程序,但是当我尝试执行Console-Applications时它不起作用。例如:

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:参数计数不匹配"

请注意,控制台应用程序没有收到任何参数,所以这很奇怪......

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

主要方法是静态的,您不需要传递Invoke个实例。你必须这样称呼它:

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

此代码处理Main()Main(string[] args)变体。