在我的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:参数计数不匹配"
请注意,控制台应用程序没有收到任何参数,所以这很奇怪......
非常感谢任何帮助:)
答案 0 :(得分:2)
主要方法是静态的,您不需要传递Invoke
个实例。你必须这样称呼它:
var parameters = m.GetParameters().Length == 0 ? null : new[] { new string[0] };
m.Invoke(null, parameters);
此代码处理Main()
和Main(string[] args)
变体。