process.start () внедрил exe без извлечения в файл сначала c # - PullRequest
10 голосов
/ 14 мая 2011

У меня есть исполняемый файл, встроенный в ресурсы моего приложения.ATM Я использую сборку отражения, чтобы извлечь исполняемый файл в свой собственный файл, а затем запустить исполнительную систему, используя процесс START ().Можно ли запустить встроенный исполняемый файл прямо из потока вместо того, чтобы сначала записать его в файл?Может кто-нибудь, пожалуйста, покажите мне наиболее эффективный способ сделать это, пожалуйста.

Ответы [ 5 ]

8 голосов
/ 14 мая 2011

Вот что я понял из вашего вопроса и ваших комментариев:

  1. Вы хотите знать, возможно ли выполнить исполняемый файл, встроенный в вашу программу, без предварительного извлечения его на диск
  2. Ваша программа .NET-программа
  3. Исполняемый файл, который вы хотите запустить, не является программой .NET

Ответ на этот вопрос: да

Однако ответ на этот вопрос также это очень, очень, трудно

Что вам нужно сделать, и заметьте, что я не знаю всех подробностей об этом, так как я не делаю этого, но в любом случае:

  1. Загрузка исполняемого кода в память
  2. Переопределить все адреса в двоичном образе, чтобы они были правильными по отношению к базовому адресу, который вы загрузили в исполняемый файл в
  3. Возможно загрузить внешние ссылки, т.е. другие библиотеки DLL, которым требуется исполняемый файл
  4. Переопределить адреса этих ссылок
  5. Возможно загрузить ссылки, необходимые для только что загруженной ссылочной библиотеки DLL
  6. Remape те DLL
  7. Повторяйте с 3 по 6 до завершения
  8. Позвоните по коду

Я предполагаю, что ваш вопрос "могу ли я сделать 1 и 8", и ответ на этот вопрос нет .

4 голосов
/ 14 мая 2011

если это исполняемый файл .net, вы сможете загрузить его в домен приложения и запустить его следующим образом:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

3 голосов
/ 14 мая 2011

Очень просто на самом деле:

byte[] bytes = File.ReadAllBytes(path);
a = Assembly.Load(bytes);

Теперь вместо чтения байтов из файла, прочитайте его с ресурса, и все готово. На самом деле есть очень хорошая статья на эту тему: Динамическая загрузка сборок встроенных ресурсов

1 голос
/ 14 мая 2011

Если вы не хотите использовать его на жестком диске, вы можете посмотреть, как сохранить его на RAM-диске, а затем запустить его оттуда.

0 голосов
/ 31 июля 2013

Это можно сделать без прикосновения к диску вашего собственного EXE-файла.

См. Здесь .... он показывает пример изображения "процесса", внедряемого как Ресурс. Он считывается в память, а затем CreateProcess и ряд других действий выполняется для создания действительного запущенного «процесса».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...