Продолжаем раскрывать тему предыдущего поста. Кто не читал предыдущий пост, тот может ничего и не понять. Мы рассмотрели как запустить программу из памяти. Но, в том случае сама программа находилась на диске, а сегодня мы запустим ее из нашего exe-файла (предварительно запихнув ее туда). Для начала подготовьте тестовый exe-файл, который будет загружаться из памяти. Вы можете взять его из предыдущего поста.
Вторым шагом мы создаем приложение-лаунчер (опять же смотрите предыдущий пост). Но его код немного отличается от предыдущего.
Вот так выглядит файл StartUpApplication.cs, в котором описана точка входа в программу (функция main)
1 |
class StartUpApplication |
3 |
public static void Main() |
5 |
Assembly assembly = Assembly.GetExecutingAssembly(); |
6 |
Stream input = assembly.GetManifestResourceStream("LaunchEmbeddedRes.test.exe"); |
9 |
MessageBox.Show("null"); |
12 |
Assembly a = Assembly.Load(new BinaryReader(input).ReadBytes((int)input.Length)); |
14 |
MethodInfo method = a.EntryPoint; |
19 |
object o = a.CreateInstance(method.Name); |
21 |
method.Invoke(o, null); |
Программа начинается с необходимости загрузить встроенный ресурс.
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.

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

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