Comment fusionner plusieurs assemblages en un seul?

87

Je consomme ma pile de services à l'aide du projet EXE (tâche de démarrage pour l'application Azure) en ce sens que j'ai copié la DLL de la pile de services suivante et certaines DLL Azure dans le projet EXE.

dll

Lorsque je construis ce projet EXE, les DLL Azure seront regroupées avec mon EXE, mais la DLL de la pile de services ne sera pas fournie avec EXE, car pour exécuter mon EXE sur n'importe quelle machine, je dois copier manuellement la DLL de toute la pile de services.

J'ai utilisé la DLL de cette pile de services pour utiliser

JsonServiceClient client = new JsonServiceClient(servicepath);

Que dois-je faire pour regrouper toutes ces DLL dans mon EXE?

Arun Rana
la source

Réponses:

120

Vous avez plusieurs options:

OU

  • utiliser un outil comme SmartAssembly (commercial),
    il peut intégrer et fusionner entre autres (pas besoin de changer votre code source)

OU

  • code que vous-même en moins de 10 lignes (changement de code source gratuit mais minime)
    marque toutes les dépendances nécessaires comme "ressource intégrée" - de cette façon, elles sont incluses dans le fichier EXE ... vous devez configurer un AssemblyResolvegestionnaire qui, au moment de l'exécution, lit les ressources et renvoie les DLL nécessaires au runtime .NET ...
Yahia
la source
4
Merci de me rappeler la solution de Jeffrey Richter consistant à intégrer des assemblages! Voir ma réponse mentionnant Costura pour un outil qui combine cela avec l'injection du code nécessaire.
CodeFox
29

L'outil que vous recherchez s'appelle ILMerge . C'est un outil de ligne de commande et peut être utilisé comme ceci:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

Il existe également un article qui décrit comment inclure ILMerge dans la configuration de votre projet VS ici

yas4891
la source
Salut, puis-je ajouter une ressource externe (fichier / image) dans l'exécutable?
Emdadul Sawon
@EmdadulSawon peut-être pouvez-vous les inclure en tant que ressources dans l'une de vos bibliothèques?
Alexander
27

Costura (un complément Fody) est un excellent outil pour inclure des assemblys référencés en tant que ressources intégrées . L'auteur Simon Kropp le décrit comme suit:

[...] une combinaison de deux méthodes:

Le résultat est une solution super simple qui nécessite simplement de récupérer Costura.Fody de NuGet.

Fonctionnalités:

  • Y compris les symboles de débogage
  • Compression d'assemblages intégrés
  • Y compris / exclure des assemblages spécifiques
  • Autres (voir Readme )
CodeFox
la source
9
OMG Costura.Fody est la bonne réponse. J'ai installé le paquet à partir de nuget, j'ai reconstruit le projet et maintenant j'ai un EXE autonome génial !!
Eric Labashosky
4
Je ne peux pas croire à quel point c'est facile. Installez simplement les packages de nuget et vous avez terminé.
iraSenthil
2
J'utilise également Costura.Fody. Il est simple à configurer et extrêmement facile à inclure des packages NuGet en tant que ressources. Obtenez un projet.
Michael Silver
1
@ user3700562, cette technique ne crée pas de nouveaux assemblys mais incorpore plutôt un ou plusieurs assemblys référencés dans un assemblage existant.
CodeFox
1
Excellente solution! Je l'utilise depuis un an et n'ai eu aucun problème. Mais veuillez noter qu'il n'inclut que les assemblys référencés par votre projet principal. Si votre application fait référence à un autre projet qui fait référence à un assembly tiers, vous devez l'ajouter à votre projet de niveau supérieur.
Demir
7

Essayez ILMerge-GUI, la fusion .NET . C'est une interface graphique Ilmergequi évite tout travail en ligne de commande.

Pritam
la source
2
Fantastique! A très bien fonctionné pour moi!
Alex Pelletier
1
Codeplex s'arrête, voici donc le lien du projet déplacé: bitbucket.org/wvd-vegt/ilmergegui
Hegi
3

Si vous avez des dépendances WPF, vos options peuvent être plus limitées ..... ILMerge ne semble pas les gérer. Costura.Fody (comme mentionné par Codefox ci-dessus) a parfaitement fonctionné pour nous et a mis environ 5 minutes à démarrer ... une très bonne expérience.

Installez avec Nuget (en sélectionnant le projet par défaut correct dans la console du gestionnaire de package)

Il fusionne toutes les DLL marquées "Copy Local" = true et produit un fichier .EXE fusionné (à côté de la sortie standard, dont la plupart n'est plus nécessaire) qui est également compressé. Celui-ci peut ensuite être utilisé de manière autonome.

La licence est MIT afin que vous puissiez modifier / distribuer selon vos besoins.

https://github.com/Fody/Costura/

Rexall
la source
2

Consultez le projet ServiceStack.Gap qui montre plusieurs exemples de comment ILMerge ServiceStack en un seul .exe multiplateforme .

ServiceStack comprend également un certain nombre d'autres fonctionnalités particulièrement bien adaptées à la création d'applications intégrées dans lesquelles:

  • Permet à vos services d'être auto-hébergés à l'aide de l'écouteur HTTP de .NET
  • Prend en charge les vues Razor précompilées
  • Prend en charge les ressources intégrées
  • Prend en charge une base de données intégrée dans Sqlite et OrmLite
  • Peut être ILMerged en un seul .exe
Mythz
la source
1

.net core 3 introduit deux nouvelles options dans la configuration du projet, appelées publication et découpage de fichier unique.

Vous pouvez trouver plus de détails sur les documents ici , la configuration du projet copiée ici pour référence.

  1. Configuration du projet:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Utilisation de la CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

Il est entièrement pris en charge pour combiner les deux options ensemble pour obtenir un assemblage unique découpé pour votre application.

Tanveer Badar
la source
Cela ne vous donne pas un seul assemblage. Il compresse simplement vos fichiers dans une archive zip, puis les décompresse dans un dossier utilisateur lorsque vous essayez d'exécuter l'application.
Jesper