|
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
|
|||||||||||||||||||||
Склеивание .dll и пользовательского .exe09.04.2016, 14:31. Показов 4759. Ответов 8
Доброго времени суток, уважаемые форумчане !
Вложений всего пять, поэтому выкладываю все одним большим архивом : TEST.rar Зеркало Поставлена такая задача : Есть у меня библиотека Lib с таким кодом : Кликните здесь для просмотра всего текста
Как видно, она в функции Process ожидает нажатия клавиши, затем вызывает событие OnKeyPressing, обрабатывает нажатие и вызывает событие OnKeyPressed. Весь ее проект - Lib.rar во вложении. Есть так же приложение Main с таким кодом : Кликните здесь для просмотра всего текста
Как видно, оно подписывается на события библиотеки и вызывает из нее функцию Process. Весь его проект - Main.rar во вложении. Все работает замечательно. Но ! Необходимо иметь на выходе только Main.exe, т.е. склеить его с библиотекой. ________________________________________ ________________________________________ __________________ И тут начались попытки. Пробовал ILMerge : Начал, вооружившись этой статьей на Хабре. Пользовался тем, что есть во вложении. 1. Создал папку TEST. 2. Положил туда ILMerge.exe, Lib.dll и Main.exe. 3. Создал там Merge.bat следующего содержания :
5. ILMerge создал Compressed.exe и Compressed.pdb, и вывел в Log.txt следующее : Кликните здесь для просмотра всего текста
ILMerge version 2.12.803.0
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved. ILMerge /target:Exe /out:Compressed.exe Main.exe /log:Log.txt Lib.dll Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework64\v2 .0.50727\..\v2.0.50727' for mscorlib.dll Running on Microsoft (R) .NET Framework v2.0.50727 mscorlib.dll version = 2.0.0.0 The list of input assemblies is: Main.exe Lib.dll Trying to read assembly from the file 'D:\Tempo\TEST\Main.exe'. Can not find PDB file. Debug info will not be available for assembly 'Main.exe'. Successfully read in assembly. There were no errors reported in Main's metadata. Trying to read assembly from the file 'D:\Tempo\TEST\Lib.dll'. Can not find PDB file. Debug info will not be available for assembly 'Lib.dll'. Successfully read in assembly. There were no errors reported in Lib's metadata. Checking to see that all of the input assemblies have a compatible PeKind. Main.PeKind = ILonly, Requires32bits, Prefers32bits Lib.PeKind = ILonly All input assemblies have a compatible PeKind value. AssemblyResolver: Assembly 'Main' is referencing assembly 'System'. AssemblyResolver: Attempting referencing assembly's directory. AssemblyResolver: Did not find assembly in referencing assembly's directory. AssemblyResolver: Attempting input directory. AssemblyResolver: Did not find assembly in input directory. AssemblyResolver: Attempting user-supplied directories. AssemblyResolver: No user-supplied directories. AssemblyResolver: Attempting framework directory. Can not find PDB file. Debug info will not be available for assembly 'System'. Resolved assembly reference 'System' to 'C:\Windows\Microsoft.NET\Framework64\v2 .0.50727\..\v2.0.50727\System.dll'. (Used framework directory.) Using assembly 'Main' for assembly-level attributes for the target assembly. Merging assembly 'Main' into target assembly. Merging assembly 'Lib' into target assembly. Copying 2 Win32 Resources from assembly 'Main' into target assembly. Transferring entry point 'Main.Program.Main(System.String[])' from assembly 'Main' to assembly 'Compressed'. There were no errors reported in the target assembly's metadata. ILMerge: Writing target assembly 'Compressed.exe'. Location for referenced assembly 'mscorlib' is 'C:\Windows\Microsoft.NET\Framework64\v2 .0.50727\mscorlib.dll' There were no errors reported in mscorlib's metadata. Location for referenced assembly 'System' is 'C:\Windows\Microsoft.NET\Framework64\v2 .0.50727\system.dll' There were no errors reported in System's metadata. ILMerge: Done. Судя по надписям "There were no errors reported in" и "Done", ILMerge полагает, что все нормально. Но Compressed.exe при запуске вылетает с APPCRASH (ILMergeCrash.jpg во вложении). Все остальные биения и мучения ни к чему не привели. Итак, с ILMerge покончено. ________________________________________ ________________________________________ __________________ Дальнейшие попытки привели меня к такому решению : положить библиотеку во встраиваемые ресурсы. Нарыл немного ссылок : Как объединить exe и Dll в один файл Подключение dll из ресурсов https://geektimes.ru/post/67836/ https://msdn.microsoft.com/ru-... s.90).aspx https://msdn.microsoft.com/ru-... s.90).aspx И, наконец, http://www.codeproject.com/Art... d-Resource. Там есть пример, но если кто-то не зарегистрирован на codeproject и не хочет, то архив есть во вложении. 1. Как там написано, добавляю Lib.dll как файл в проект. 2. Для библиотеки, которая в References, устанавливаю параметр "Копировать локально" в "False", а для той, которая файл - "Действие при сборке" во "Внедренный ресурс". 3. Добавляю в проект EmbeddedAssembly.cs. 4. Добавляю в код Main using System.Reflection; 5. Изменяю код Main следующим образом :
По идее, если сборка не найдена, должна вызваться CurrentDomain_AssemblyResolve. Она, в свою очередь, должна загрузить из ресурсов библиотеку и передать её кому нужно. Она этого не делает, потому что если библиотеке в References вернуть параметр "Копировать локально" в "True", то всё будет работать, как раньше. ________________________________________ ________________________________________ __________________ Что я делаю не так и есть ли альтернативы ? Заранее благодарен за помощь.
0
|
|||||||||||||||||||||
| 09.04.2016, 14:31 | |
|
Ответы с готовыми решениями:
8
Склеивание *.exe файлов
Склеивание двух exe |
|
|
|||||||
| 09.04.2016, 16:26 | |||||||
1
|
|||||||
|
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
|
|
| 09.04.2016, 20:11 [ТС] | |
|
0
|
|
|
|
|
| 09.04.2016, 21:31 | |
|
0
|
|
|
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
|
|
| 10.04.2016, 00:08 | |
|
prog63, в дополнение к ответу insite2012, я бы предложил хранить библиотеку в ресурсах, но не в ущерб компиляции. Пример использования в приложенном проекте. В этом решении два проекта: ConsoleApplication1 и ClassLibrary1. При запуске ConsoleApplication1.exe обращается к ClassLibrary1.dll, но ему абсолютно не важно, есть ли рядом эта сборка: при отсутствии, он сам загрузит её в память из ресурсов. Для демонстрации, после компиляции можно просто удалить файл библиотеки и запустить exe.
На что стоит обратить особое внимание при чтении кода: 1) Подписка на AssemblyResolve происходит выше по стеку, чем первое упоминание Class1 2) На то, как устроен квалификатор пути при вызове GetManifestResourceStream и какой тип использован для выбора сборки 3) Сборка библиотеки добавлена как ссылка (важно, если код библиотеки обновляется)
3
|
|
|
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
|
|
| 13.04.2016, 19:14 [ТС] | |
|
Спасибо ! Попробую разобраться с Вашим решением.
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 20.01.2017, 13:10 | |
|
0
|
|
| 20.01.2017, 13:10 | |
|
Помогаю со студенческими работами здесь
9
Svchost.exe, onion.exe, openvg.exe torrc и куча dll и cl, а также папка tor в Roaming Как множество dll собрать в один dll или exe файл?
Возможно ли собрать .exe и несколько .dll в один .exe? AppModule.exe - точка входа в процедуру cuLaunchKernel_ptsz не найдена в библиотеке DLL nvcuda.dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|