Приветствую вас, друзья! Сегодня я расскажу как запустить исполняемый файл (exe) не с жесткого диска, а из памяти. Для чего это может понадобиться – конкретно непонятно. Но иметь ввиду, что так можно сделать, нужно. Что нам необходимо для работы: две программы написанные на C#. Одна программа служит лаунчером, а вторая запускаться этим лаунчером из памяти.
Для начала создайте обычное приложение с формой. Поместите на него произвольное количество элементов – кнопки, подписи и т.д. Это приложение, которое будет запускаться из памяти.
Теперь нам неоходимо приложение-лаунчер. Его задача – побайтно считать файл в память, определить точку входа и записать его.
Создайте еще один проект. Первое, что мы должны сделать – отказаться от файла Program.cs и метода Main, который в нем описан. Т.е. нам необходимо описать новую точку входа и назначить ее. Создайте новый файл StartUpApplicationю.cs со следующим содержимым:
1 |
class StartUpApplication |
3 |
public static void Main() |
5 |
var frm = new frmMain(); |
6 |
if (frm.ShowDialog() == DialogResult.OK) |
10 |
string pathToFile = frm.lstMain.SelectedItem.ToString(); |
12 |
var fs = new FileStream(pathToFile, FileMode.Open); |
14 |
var br = new BinaryReader(fs); |
16 |
byte[] bin = br.ReadBytes((int)(fs.Length)); |
23 |
Assembly a = Assembly.Load(bin); |
25 |
MethodInfo method = a.EntryPoint; |
30 |
object o = a.CreateInstance(method.Name); |
32 |
method.Invoke(o, null); |
Как видите, здесь описан запуск главной формы приложения. Его нельзя было описать стандартным способом, т.к. при вызове method.Invoke(o, null) будет вываливаться ошибка. Это связано с тем, что Visual Studio по-умолчанию добавляет строку Application.SetCompatibleTextRenderingDefault для использования новых библиотек GDI+, которая должна вызваться перед созданием IWin32Window объектов.
Когда все будет готово к компиляции, заходим в свойство проекта и точкой входа выбираем наш новый класс StartUpApplication.
Компилируйте лаунчер. Рядом с созданным запускаемым файлом положите файл с первого проекта. Запустите лаунчер и выберите файл для запуска.
Обратите внимание, что тестовый файл можно удалить с диска, в то время, когда тот запущен. Его никто не держит.