Как выполнить консольное приложение .NET в памяти с помощью C #?

1

Из моей программы С# я пытаюсь выполнить байт [], содержащий другой исполняемый файл.NET (консольное приложение С#) непосредственно из памяти и не касаясь диска.

Я знаю, что здесь есть похожие вопросы, а также некоторые хорошие статьи о том, как это сделать:

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 Form, он отлично работает. Но когда "MyTestProgram.exe" является консольным приложением, он возвращает следующую ошибку:

"Необработанное исключение: System.Reflection.TargetParameterCountException: несоответствие счетчика параметров"

Обратите внимание, что консольное приложение не получает никаких аргументов, так что это странно...

Любая помощь будет очень высоко ценится :)

  • 4
    как обычно, метод Main имеет один параметр string[] param . Вы не отправляете его в Invoke call, но вам следует.
  • 0
    спасибо за сверхбыструю помощь, но как мне сделать вызов Invoke, чтобы учесть параметр string [] метода Main консольного приложения?
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Основной метод статический, вам не нужно передавать Invoke экземпляра. Вы должны называть это следующим образом:

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

Этот код обрабатывает варианты Main() и Main(string[] args).

  • 0
    @samsam см. отредактированный ответ.
  • 0
    !!! Удивительно, что теперь это работает как шарм. Ты действительно сотворил немного магии: D Спасибо, бабло!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню