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é:
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, ...).
Jettes un coup d'oeil à ThinstallThinApp
Jetez un œil à BoxedApp . Bonne chance!
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.
Essayez Powerpacker . Evalaze est une autre solution de virtualisation gratuite. Enigma Virtual Box Édition FREEWARE
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.
Vous pouvez utiliser valgrid, thinstall ou boxedapp .... Je préfère ce dernier.
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.