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

本文关键字:执行 NET 控制台 应用程序 内存 何使用 | 更新日期: 2023-09-27 18:28:44

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

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

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

然而,它们都遇到了同样的问题,它们只适用于在内存中执行Windows窗体应用程序,但当我尝试执行控制台应用程序时,它不起作用。示例:

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

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

如有任何帮助,我们将不胜感激:)

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

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

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

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