• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Запуск исполняемого файла из памяти. Часть 2 (из 3-х)

Продолжаем раскрывать тему предыдущего поста. Кто не читал предыдущий пост, тот может ничего и не понять. Мы рассмотрели как запустить программу из памяти. Но, в том случае сама программа находилась на диске, а сегодня мы запустим ее из нашего exe-файла (предварительно запихнув ее туда). Для начала подготовьте тестовый exe-файл, который будет загружаться из памяти. Вы можете взять его из предыдущего поста.

Вторым шагом мы создаем приложение-лаунчер (опять же смотрите предыдущий пост). Но его код немного отличается от предыдущего.

Вот так выглядит файл StartUpApplication.cs, в котором описана точка входа в программу (функция main)

1 class StartUpApplication
2 {
3     public static void Main()
4     {
5         Assembly assembly = Assembly.GetExecutingAssembly();
6         Stream input = assembly.GetManifestResourceStream("LaunchEmbeddedRes.test.exe");
7         if (input == null)
8         {
9             MessageBox.Show("null");
10             return;
11         }
12         Assembly a = Assembly.Load(new BinaryReader(input).ReadBytes((int)input.Length));
13  
14         MethodInfo method = a.EntryPoint;
15         //если найдена точка входа
16         if (method != null)
17         {
18             //создаем экземпляр главной формы
19             object o = a.CreateInstance(method.Name);
20             //запускаем приложение через точку входа
21             method.Invoke(o, null);
22         }
23  
24     }
25 }

Программа начинается с необходимости загрузить встроенный ресурс.
Assembly assembly = Assembly.GetExecutingAssembly() – с помощью этого получаем текущую сборку. А assembly.GetManifestResourceStream(«LaunchEmbeddedRes.test.exe») возвращает поток, который можно прочитать и записать в память. В строке LaunchEmbeddedRes.test.exe первое – это называние namespace нашего проекта, а test.exe – имя нашего ресурса. Соответственно у вас возможно будет по-другому.

Далее по коду: загружаем test.exe в память. MethodInfo method = a.EntryPoint – получаем ссылку на точку входа и далее отправляем на выполнение.

Теперь важное: как добавить ресурс в проект, чтобы его можно было потом прочитать по LaunchEmbeddedRes.test.exe.
Откройте Solution Explorer проекта в меню View. Правой кнопкой мыши на проекте и меню Add exists добавляем наш test.exe.

29

Теперь в свойствах этого файла установите поле Build Action установите Embedded Resource. Все, теперь файл test.exe будет компилироваться как встроенный ресурс.

30

Скриншот сделан в Process Explorer. На картинке видно что запущен LaunchEmbeddedRes, но самого test.exe не видно. По крайней мере в диспетчере задач :)

На сегодня все. Пробуйте, запускайте, комментируйте. Всего наилучшего.