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

И немного рекламы: Ознакомьтесь с паркетная доска. Паркетная доска синтерос отзывы по адресу ул. Крейсера "Авроры", 16

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

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

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

class StartUpApplication
{
    public static void Main()
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        Stream input = assembly.GetManifestResourceStream("LaunchEmbeddedRes.test.exe");
        if (input == null)
        {
            MessageBox.Show("null");
            return;
        }
        Assembly a = Assembly.Load(new BinaryReader(input).ReadBytes((int)input.Length));

        MethodInfo method = a.EntryPoint;
        //если найдена точка входа
        if (method != null)
        {
            //создаем экземпляр главной формы
            object o = a.CreateInstance(method.Name);
            //запускаем приложение через точку входа
            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 test.exe

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

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

Популярность: 16%

Теги:

Если у вас возникли вопросы, вы можете оставить их в комментариях

Комментарии к статье

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

Оставить комментарий

(обязательно)

(обязательно)