У меня есть исполняемый файл, встроенный в мои ресурсы приложения. ATM Я использую сборку для извлечения исполняемого файла в свой собственный файл, а затем запускаю исполнительный процесс с помощью процесса START(). Возможно ли запустить встроенный исполняемый файл прямо из потока вместо того, чтобы сначала записать его в файл? Может кто-нибудь, пожалуйста, покажет мне наиболее эффективный способ сделать это, пожалуйста.
Process.start() embedded exe без извлечения в файл first С#
Ответ 1
Вот что я собираю из вашего вопроса и ваших комментариев:
- Вы хотите знать, возможно ли выполнить исполняемый файл, встроенный в вашу программу, без предварительного извлечения его на диск.
- Ваша программа - это .NET-программа.
- Исполняемый файл, который вы хотите выполнить, не является программой .NET.
Ответ на этот вопрос: да
Однако ответ на это также очень, очень, тяжелый
Что вам нужно сделать, и обратите внимание, что я не знаю всех подробностей об этом, так как я этого не делаю, но в любом случае:
- Загрузите исполняемый код в память
- Удалите все адреса в двоичном изображении так, чтобы они были правильны в отношении базового адреса, который вы загрузили исполняемый файл в
- Возможно, загружаются внешние ссылки, т.е. другая DLL, необходимая для выполнения
- Изменить адреса этих ссылок
- Возможно, загрузите ссылки, необходимые для только что загруженных ссылок DLL
- Remape the dll
- Повторяйте с 3 по 6 до конца
- Вызвать код
Я предполагаю, что ваш вопрос: "Могу ли я сделать 1 и 8", и ответ на это нет.
Ответ 2
если это исполняемый файл .net, вы можете загрузить его в appdomain и запустить его таким образом:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx
Ответ 3
Очень просто:
byte[] bytes = File.ReadAllBytes(path);
a = Assembly.Load(bytes);
Теперь вместо того, чтобы читать байты из файла, прочитайте его с ресурса, и все готово. На самом деле есть очень хорошая статья: Динамическая загрузка встроенных сборок ресурсов
Ответ 4
Если вы не хотите его на жестком диске, вы можете посмотреть его сохранение на ram-drive, а затем запустить его оттуда.
Ответ 5
Это можно сделать, если ваш родной EXE не должен касаться диска.
См. здесь.... он показывает пример изображения "процесса", внедренного как ресурс. Он читается в памяти, а затем CreateProcess
и выполняется ряд других действий для создания действующего "процесса".