Упаковка exe + dll в один исполняемый файл (не .NET)

Возможный дубликат:
Как можно объединить dll Windows C ++ с исполняемым файлом приложения C #?

Кто-нибудь знает о программе, которая может упаковать несколько DLL и .EXE в один исполняемый файл. Я не говорю здесь о .NET, я говорю об общих библиотеках DLL, некоторые из которых я создаю на C ++, некоторые - это внешние DLL, которые я не могу контролировать.

Мой конкретный случай - программа python, упакованная с py2exe, где я хотел бы «спрятать» другие DLL, упаковав их. Однако вопрос достаточно общий.

Вещи, на которые смотрели:

  • ILMerge: специфично для .NET
  • NETZ: специфично для .NET
  • UPX: выполняет сжатие DLL, но не упаковывает несколько DLL + EXE
  • FileJoiner:
Almost got it. It can pack executable + anything into one exe but when opened, it will launch the default opener for every file that was packed. So, if the user user dlldepend installed, it will launch it (becaues that's the default dll opener).

Может, это невозможно?


Резюме ответов:

Открытием DLL управляет ОС, поэтому упаковка DLL в исполняемый файл означает, что в какой-то момент их нужно извлечь в место, где ОС может их найти. Никакой волшебной пули.

Итак, то, что я хочу, невозможно.

Пока не...

Что-то меняем в ОС. Спасибо, Конрад, за то, что указал мне на ThinInstall, который виртуализирует приложение и механизм загрузки ОС. . С ThinInstall можно упаковать все в один exe (DLL, настройки реестра, ...).


dll
person Philippe F    schedule 03.12.2008    source источник
comment
Вы также можете использовать boxedapppacker - аналогично thinstall.   -  person MastAvalons    schedule 24.01.2012
comment
или используйте BoxedApp SDK - библиотеку разработчика для файлов виртуализации и реестра   -  person MastAvalons    schedule 10.04.2012
comment
Недавно PELock был обновлен с возможностью связывания DLL pelock.com/img/en/products/pelock/virtual-dll-libraries/   -  person Bartosz Wójcik    schedule 18.07.2016
comment
Я не думаю, что это дубликат, поскольку исходное приложение не написано на C #, как якобы повторяющийся вопрос. Есть еще одно простое и бесплатное решение. (По крайней мере, для моего простого проекта это сработало.): См. этот ответ в Superuser   -  person Julo    schedule 12.04.2019


Ответы (9)


Взгляните на Thinstall ThinApp

person Rad    schedule 03.12.2008
comment
похоже, что ссылка больше не действительна - person angularrocks.com; 02.10.2011
comment
@bigb: он был приобретен VMWare: en.wikipedia.org/wiki/VMware_ThinApp - person Ben Voigt; 04.10.2011
comment
Это работает ... но для тех, кто рассматривает этот вариант, ThinApp упаковывает ваше приложение вместе с чем-то под названием TSASurrogate.exe, а в версии 5.1 это 14 мегабайт. В случае, на который я смотрел, это более чем удвоило размер программы. - person HostileFork says dont trust SE; 17.01.2015

Взгляните на BoxedApp. Удачи!

person Community    schedule 13.04.2010
comment
В отличие от ThinApp и Evalaze, BoxedApp не увеличивает размер приложения на 14 МБ, а всего на пару МБ. И это хорошо. - Четыре года назад я прокомментировал здесь, сказав, что он не работает с упакованными EXE-файлами UPX, но автор написал мне, чтобы я сказал, что я должен использовать запуск в виртуальной среде (я не знаю, была ли эта опция раньше или нет ) - и это сработало. У меня были другие проблемы, когда я тогда попытался использовать упакованное приложение Qt. Но, как написал автор относительно комментария, он готов пообщаться, если у вас возникнут проблемы. Так что, если вы в порядке с коммерческим решением, это может сработать для вас. - person HostileFork says dont trust SE; 13.02.2019
comment
BoxedApp также выполняет некоторую виртуализацию реестра. Можно ли выполнить слияние exe + dll без каких-либо других функций? - person pts; 07.07.2020

Попробуйте Powerpacker. Evalaze - еще одно бесплатное решение для виртуализации. Enigma Virtual Box БЕСПЛАТНАЯ версия

person Kachwahed    schedule 03.06.2011
comment
Enigma Virtual Box работал у меня - person toster-cx; 08.01.2016
comment
Enigma Virtual Box работает нормально. Остальные ссылки вроде мертвые. - person AntonK; 25.03.2019

Если исполняемый файл статически ссылается на DLL, то есть нет вызовов LoadLibrary, тогда я не думаю, что есть какие-либо механизмы для упаковки DLL в исполняемый файл, поскольку загрузка DLL выполняется загрузчиком приложения ОС до "main "вызываемая функция. Насколько мне известно, единственный способ обойти это - поместить exe и dll в другой exe. Эта оболочка exe распаковывает настоящий exe и библиотеки DLL во временную папку и запускает exe, удаляя файлы при выходе из exe.

Если вы вызываете LoadLibrary/Ex для загрузки dll, извлеките dll из ресурсов exe в файл до вызова LoadLibrary/Ex.

Настоящая проблема заключается в том, что функция LoadLibrary выполняет большую часть исправления адресов при загрузке библиотеки и работает только при загрузке из файла.

person Skizz    schedule 03.12.2008
comment
Я полагаю, вопрос в том, «можно ли написать компоновщик, который захватывает код из библиотеки DLL так же, как код может быть получен из файла LIB и добавлен в связываемый EXE-файл»? - person Skizz; 03.12.2008
comment
Я использую оболочку .EXE. Очевидно, в настоящее время вам нужно немного подумать о том, куда вы все распаковываете - не думайте, что вы можете распаковать в \ program files \ ... без необходимости запуска от имени администратора - person Will Dean; 03.12.2008

Вы можете добавить библиотеки DLL как двоичные ресурсы в свой EXE. При запуске ваш EXE может извлечь ресурсы во временную папку и LoadLibrary() полученные библиотеки DLL.

person Arnout    schedule 03.12.2008

Вы смотрели мой список дешевых утилит?

Предполагалось, что будет несколько недорогих (то есть довольно дешевых) инструментов, которые будут связывать библиотеки DLL не-сетевых приложений, например:

1.) Molebox Pro (100 евро) 2.) BitArt's Fusion (160 долларов США) 3.) VB Wrap (100 долларов США) 4.) Пакет PE (30 долларов США).

Кроме того, на сайте «www.oreans.com» вы можете найти программный пакет для защиты eu 320, который, как они утверждают, может связывать файлы Win32 или .Net вместе; однако, когда я спросил их о конкретном сценарии, я бы использовал их «XBundler для Win32 / .NET», чтобы упаковать EXE «.Net», а затем попытался бы запустить его на Windos 98 (без фреймворка) , они сказали, что это не сработает. :-(

EXE поклонник

person Community    schedule 02.03.2009

Вы можете использовать valgrid, thinstall или boxedapp .... Я предпочитаю последнее.

person John Smith    schedule 23.11.2011

MoleBox Pro делает именно то, что вы хотите, но это условно-бесплатная программа, и, если вы не купите полную версию, упакованные исполняемые файлы будут отображать диалоговое окно при запуске, говоря что-то вроде «Этот файл был упакован пробной версией MoleBox, пожалуйста, не распространять это "

Вы можете скачать его здесь: ссылка

К сожалению, мне не удалось найти полностью удовлетворительного и бесплатного решения.

person Community    schedule 07.01.2009
comment
Обратите внимание, что MoleBox имел открытый исходный код. Но на момент написания он не поддерживался никакими добавленными коммитами с момента его публикации (август 2017 г.). - person HostileFork says dont trust SE; 13.02.2019

Мне сказали, что можно запросить ссылку общего объекта на другой общий объект, таким образом объединяя их в один в Linux.

Но это не будет работать с собственными DLL-библиотеками Windows, мне приходит в голову одна вещь: мы можем просто использовать компоновщик для связывания всех объектов вместе, независимо от того, к какому проекту они принадлежат изначально. Конечно, у них должны быть похожие варианты ссылок.

person baye    schedule 05.03.2009