Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832

Запуск программы из памяти

10.10.2015, 12:35. Показов 8712. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Недавно перешел с vb net на c# из-за отсутствия перспективы исполнять файл без выкидывания программы на диск и с толкнулся с данной проблемой:
Нашел код для запуска exe в памяти:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        private void button1_Click(object sender, EventArgs e)
        {
 
            //Get the current assembly
            Assembly assembly = Assembly.GetExecutingAssembly();
 
            //Get the assembly's root name
            string rootName = assembly.GetName().Name;
 
            //Get the resource stream
            Stream resourceStream = assembly.GetManifestResourceStream(rootName + "." + "file.exe");
 
            //Verify the internal exe exists
            if (resourceStream == null)
                return;
 
            //Read the raw bytes of the resource
            byte[] resourcesBuffer = new byte[resourceStream.Length];
 
            resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
            resourceStream.Close();
 
            //Load the bytes as an assembly
            Assembly exeAssembly = Assembly.Load(resourcesBuffer);
 
            //Execute the assembly
            exeAssembly.EntryPoint.Invoke(null, null); //no parameters
        }
Но он не работает. То есть нажимаю на кнопку, никакого исключения не выходит. В чем может быть проблема?

Добавлено через 21 час 15 минут
Ребята, да, я не знаю практически ничего из C#. Как хотябы запустить net сборку в памяти? Слышал что это проще
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2015, 12:35
Ответы с готовыми решениями:

Запуск программы из памяти в отдельном процессе
Есть программа в виде массива байт. Необходимо ее запустить. Есть несколько вариантов: 0) Самый реальный вариант: заставить...

Запуск окна программы с трэя и очистка памяти
Доброе время суток, господа программисты! Во время написания программы возникла проблема очистки памяти. Я пытаюсь реализовать...

Запуск программы из памяти
Доброго времени суток. Возникла задача запускать скомпилированную программу из памяти. То есть, я имею скомпилированный exe-шник, считываю...

16
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
10.10.2015, 14:09
Цитата Сообщение от ziqp Посмотреть сообщение
Stream resourceStream = assembly.GetManifestResourceStream(rootN ame + "." + "file.exe");
Здесь сторонний exe загружается из ресурсов приложения, и который должен быть туда предварительно загружен, видимо вы этого не делали.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
10.10.2015, 14:26  [ТС]
Конечно так и было) Но все же я это исправил и ничего не изменилось. вот скрин
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
10.10.2015, 14:40
Тип ресурса - embedded? Должен быть embedded.

Добавлено через 11 минут
В студии в Solution Explorer выбираете ваш файл, переходите в свойства (F4), и там в комбобоксе можно выбрать Embedded.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
10.10.2015, 14:44  [ТС]
сделал. опять не исполняется.
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
10.10.2015, 15:11
Проверяйте полный путь.
Цитата Сообщение от ziqp Посмотреть сообщение
Stream resourceStream = assembly.GetManifestResourceStream(rootN ame + ".Resources." + "file.exe");
Добавлено через 8 минут
Очевидно же, путь некорректный указали.

Добавлено через 6 минут
Вот этот - корректный:
C#
1
Stream resourceStream = assembly.GetManifestResourceStream(rootName + ".Resources." + "file.exe");
Просто процитировал вас и там же исправил.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
10.10.2015, 15:56  [ТС]
Спасибо. похоже что что-то исполняется. Выводится "необрабатываемое исключение в приложении".
Файл на vb net, просто должна выводиться форма где написано hello world.
visual studio указал эту строку в исключении:
C#
1
Application.SetCompatibleTextRenderingDefault(false);
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
10.10.2015, 16:00
Цитата Сообщение от ziqp Посмотреть сообщение
необрабатываемое исключение в приложении
Какое исключение? Побольше бы кода.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
10.10.2015, 16:01  [ТС]
Если что, ошибка в коде, созданное студией в файле Program.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace launcher
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
11.10.2015, 01:42
Цитата Сообщение от ziqp Посмотреть сообщение
Недавно перешел с vb net на c# из-за отсутствия перспективы исполнять файл без выкидывания программы
1.На vb.net все тоже самое что и на c# , платформа то одна.
2.file.exe - должен быть на базе NET , иначе ничего не выйдет.
3.Application.SetCompatibleTextRendering Default(false); - странно конечно , можно закомментировать. , но скорее ошибка в другом месте.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
11.10.2015, 07:07  [ТС]
Все же начал я это делать на C#. Знать его тоже не помешает.
file.exe я написал на vb.net. Так что вроде как и должен запускаться.
А ошибка в самом "запускаторе". Кто может по-эксперементировать, проверьте код у себя. Во времени дебага студия остановилась именно на этом коде

Добавлено через 2 минуты
И да, если закоментировать, студия орет и указывает на эту строку
C#
1
exeAssembly.EntryPoint.Invoke(null, null);
Тоесть по сути исполняется эта команда, но она переадресовывает на точку входа, где ошибка в этой команде
C#
1
Application.SetCompatibleTextRenderingDefault(false);
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
11.10.2015, 10:57
Цитата Сообщение от ziqp Посмотреть сообщение
Кто может по-эксперементировать, проверьте код у себя.
Загрузите ваш проект на форум.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
11.10.2015, 14:54  [ТС]
вот launcher.rar
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
11.10.2015, 16:43
Цитата Сообщение от ziqp Посмотреть сообщение
//Execute the assembly
* * * * * * exeAssembly.EntryPoint.Invoke(null, null); //no parameters
Уберите это и добавьте вот это:
C#
1
2
3
4
5
6
7
8
foreach (var exportedType in exeAssembly.ExportedTypes)
            {
                if (exportedType.Name == "Form1")
                {
                    var instance = Activator.CreateInstance(exportedType);
                    ((Form)instance).Show();
                }
            }
Костыль. В процессе работы было исключение - что-то типа "Невозможно загрузить второй цикл обработки сообщений в одном потоке, вместо этого используйте Form.ShowDialog". Видимо, потому что запускаемое приложение - gui приложение (нюансы работы windows с окнами, один gui-поток - один цикл обработки, насколько сам понимаю).

ps: прошелся рефлектором, посмотрел, что в загружаемой сборке есть тип c именем "Form1".

Добавлено через 22 минуты
Для данного приложения загрузка из памяти не оправдывает себя - потому что вы просто открываете формочку.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
11.10.2015, 16:59  [ТС]
Ура работает! На си++ подобную программу уже не запустить в памяти?

Добавлено через 2 минуты
Еще вопрос.. консольное приложение возможно так запустить?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,224
11.10.2015, 17:02
Цитата Сообщение от ziqp Посмотреть сообщение
Еще вопрос.. консольное приложение возможно так запустить?
Это костыль только для данного exe-файла - то есть просто создается экземпляр типа и используется его метод.
Консолька запускается уже с вашим первоначальным кодом - более корректным.
Про с++ не знаю - не пробовал.
0
129 / 65 / 16
Регистрация: 03.09.2015
Сообщений: 832
12.10.2015, 11:03  [ТС]
Так для консольного приложения вместо Form1 нужно писать например module1? или подойдет
C#
1
exeAssembly.EntryPoint.Invoke(null, null);
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2015, 11:03
Помогаю со студенческими работами здесь

Запуск .NET C# программы из памяти C++ приложения
Понадобилось реализовать запуск .NET C# программы прямо из памяти C++ приложения. Использую функцию: BOOL ExecFile(LPWSTR szFilePath,...

выдает ошибку памяти. Запуск программы в юникс
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #define BUFFER 50 char* upCase(const char* str) { size_t len =...

Запуск программы ( .exe) с ограничением по оперативной памяти
Здравствуйте! Есть ли способ запустить программу ограничив её в оперативной памяти, ну например 60 мегабайт? Т.е. , при достижении этого...

Запуск программы без создания окна. Запуск фоновой программы
Вопрос, как сделать, чтобы консольное приложение при запуске не создавало окошко консоли. Т.е. запустился процесс, но визуально ничего не...

Запуск студией и запуск самой виндой. Разница работы программы
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При компиляции в релиз-режиме и запуске...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru