Из моей программы С# я пытаюсь выполнить байт [], содержащий другой исполняемый файл.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: несоответствие счетчика параметров"
Обратите внимание, что консольное приложение не получает никаких аргументов, так что это странно...
Любая помощь будет очень высоко ценится :)
Основной метод статический, вам не нужно передавать Invoke
экземпляра. Вы должны называть это следующим образом:
var parameters = m.GetParameters().Length == 0 ? null : new[] { new string[0] };
m.Invoke(null, parameters);
Этот код обрабатывает варианты Main()
и Main(string[] args)
.
Main
имеет один параметрstring[] param
. Вы не отправляете его вInvoke
call, но вам следует.