web-dev-qa-db-fra.com

Empaquetage d'un exe + dll dans un exécutable (pas .NET)

Duplicata possible:
Comment une dll Windows C++ peut-elle être fusionnée dans un exe d'application C #?

Quelqu'un est-il au courant d'un programme qui peut regrouper plusieurs DLL et un .EXE dans un seul exécutable. Je ne parle pas du cas .NET ici, je parle de DLL générales, dont certaines que je génère en C++, certains autres sont externes DLL Je n'ai aucun contrôle sur.

Mon cas spécifique est un python packagé avec py2exe, où je voudrais "cacher" l'autre DLL en les empaquetant. La question est assez générale cependant .

Les choses qui ont regardé:

  • ILMerge: spécifique à .NET
  • NETZ : spécifique à .NET
  • UPX : fait DLL compression mais pas multiple DLL + emballage EXE
  • FileJoiner :
J'ai presque compris. Il peut regrouper l'exécutable + n'importe quoi dans un seul exe, mais une fois ouvert, il lancera l'ouvreur par défaut pour chaque fichier qui a été compressé. Donc, si l'utilisateur utilisateur dlldepend installé, il le lancera (car c'est l'ouvreur de dll par défaut).

Ce n'est peut-être pas possible?


Résumé des réponses:

L'ouverture des DLL est gérée par le système d'exploitation, donc emballer DLL dans l'exécutable signifie qu'à un moment donné, elles doivent être extraites à un endroit où le système d'exploitation peut les trouver. Pas de solution miracle.

Donc, ce que je veux n'est pas possible.

Sauf si...

Nous changeons quelque chose dans le système d'exploitation. Merci Conrad de m'avoir indiqué ThinInstall , qui virtualise l'application et le mécanisme de chargement du système d'exploitation. Avec ThinInstall, il est possible de tout emballer dans un seul exe (DLL, paramètres de registre, ...).

31
Philippe F

Jettes un coup d'oeil à ThinstallThinApp

5
Rad

Jetez un œil à BoxedApp . Bonne chance!

6
Art

Si l'exécutable est lié statiquement à la DLL, c'est-à-dire qu'il n'y a pas d'appels à LoadLibrary, alors je ne pense pas qu'il y ait de mécanismes pour emballer le DLL dans l'exécutable depuis le DLL est effectué par le chargeur d'application du système d'exploitation avant l'appel de la fonction "main". Le seul moyen de contourner ce problème, à ma connaissance, est de placer l'exe et les dll dans un autre Cet exe wrapper décompresse l'exe réel et les DLL dans un dossier temporaire et démarre l'exe, supprimant les fichiers lorsque l'exe se termine.

Si vous appelez LoadLibrary/Ex pour charger la dll, extrayez la dll des ressources exe vers un fichier avant l'appel à LoadLibrary/Ex.

Le vrai problème est que la fonction LoadLibrary corrige beaucoup les adresses lorsque la bibliothèque est chargée et ne fonctionne que lors du chargement à partir d'un fichier.

4
Skizz

Essayez Powerpacker . Evalaze est une autre solution de virtualisation gratuite. Enigma Virtual Box Édition FREEWARE

4
Kachwahed

Vous pouvez ajouter les DLL en tant que ressources binaires dans votre EXE. Au démarrage, votre EXE peut alors extraire les ressources dans un dossier temporaire et LoadLibrary() les DLL résultantes.

1
Arnout

Vous pouvez utiliser valgrid, thinstall ou boxedapp .... Je préfère ce dernier.

1
John Smith

On m'a dit qu'il est possible de demander un lien d'objet partagé vers un autre objet partagé afin de les combiner en un seul sous Linux

Mais cela ne fonctionnera pas pour les dll natives de Windows, une chose m'arrive est que nous pouvons simplement utiliser l'éditeur de liens pour lier tous les objets ensemble, quel que soit le projet auquel ils appartiennent à l'origine. Bien sûr, ils doivent avoir des options de lien similaires.

0
Baiyan Huang