Le développement Winform/wpf fait inévitablement référence à de nombreuses DLL tierces, mais à chaque fois que vous l’intégrez, vous devez copier les fichiers du répertoire Debug vers le client ou les partager, ce qui n’est pas très pratique à utiliser. J’ai essayé plusieurs logiciels pour fusionner des fichiers dll auparavant, comme ILMerge, Enigma Virtual Box, etc., mais jusqu’à ce que j’apprenne l’existence de « Costura.Fosy », je trouvais que le monde était bien meilleur~
Ce qui suit est un programme écrit par Winform, faisant référence aux deux DLL « HttpHelper.dll » et « Newtonsoft.Json.dll », lors de la génération du programme, il y aura un fichier exe et ces deux fichiers DLL, ce qui met les gens très mal à l’aise, et s’il y a une DLL de moins, le programme peut signaler une exception, comme montré dans la figure ci-dessous :
Le lien ci-dessous indique l’utilisation précédente (non recommandée)
Avec l’outil Costura.Fody, vous pouvez fusionner la DLL source dans l’EXE cible
Page d’accueil du projet : https://github.com/Fody/Costura
Comment utiliser et installer directement le package Nuget :
Une fois que vous avez réussi à ajouter Costura.Fody, la solution ajoutera automatiquement FodyWeavers.xml fichier.
Régénérez la solution, vous pouvez voir votre succès dans le répertoire de génération de programme, toutes les DLL sont parfaitement fusionnées dans l’exe, vous pouvez copier directement le fichier exe vers le client pour l’exécuter indépendamment. Comme montré ci-dessous :
1>------ Toutes les reconstructions ont été lancées : Projet : itsvse, Configuration : Débogage de tout CPU ------ 1> Exécution de Fody : Fody (version 2.0.0.0) 1> Fody/Costura : Aucune référence à « Costura.dll » trouvée. Références non modifiées. 1> Fody/Costura : Intégrer 'E :\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura : Intégrer 'E :\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody : Fody terminé 609ms. 1> Défaut : J’ai sauté l’assembleur de vérification car il est désactivé en configuration 1> Fody : Vérification terminée en 3 ms. 1> itsvse -> E :\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Régénérer tous : 1 réussit, 0 échoue et 0 ========== sauté
Comme on peut le voir sur l’image ci-dessus, le fichier généré ne contient pas de Newtonsoft.Json.dll, HttpHelper.dll et Costura.dll ne sont pas générés, seulement deux fichiers, itsvse.exe peuvent être exécutés directement sans erreurs ! (Le fichier PDB peut être supprimé).
Utilisons l’outil ILSpy pour décompiler notre programme et jetons un œil au code source généré, comme montré dans la figure ci-dessous :
Introduction au principe de mise en œuvre
Lorsque le CLR tente de charger un assembleur mais échoue, il génère l’événement AppDomain.AssemblyResolve. Notre programme peut écouter cet événement et retourner l’assembleur que le CLR tente de charger dans le gestionnaire d’événements afin que le programme puisse continuer à fonctionner normalement.
Fody.Costura intègre toutes les DLL référencées par l’EXE dans le fichier EXE lors de la construction du projet. Lorsqu’un programme utilise l’une de ces DLL lors de l’exécution (l’événement AppDomain.AssemblyResolve est déclenché car le CLR ne trouve pas le fichier DLL), la DLL requise est extraite des ressources intégrées du fichier EXE.
Vous pouvez voir que la méthode Attach écoute l’événement AppDomain.AssemblyResolve. Lorsque le CLR ne charge pas un assembleur avec succès, le gestionnaire d’événements AssemblyResolve est exécuté. AssemblyResolve tente d’obtenir l’assemblage cible de la ressource intégrée de l’assembleur chargé via la méthode Common.ReadFromEmbeddedResources et le renvoie au CLR.
En voyant cela, vous vous demandez peut-être, quand la méthode Attach a-t-elle été mise en place ?
En fait, pour le langage C#, le CLR cache un gros truc : il peut exécuter un code initialisé avant que chaque module (chaque assembleur contient un ou plusieurs modules) ne soit chargé. Malheureusement, le langage C# n’a aucun contrôle sur cette partie du code. Fody.Costura injecte du code IL directement dans la fonction d’initialisation du module interne de l’assemblage EXE, et cette partie du code IL exécute en fait la méthode Attach. Ainsi, une fois l’assembleur EXE chargé, la méthode Attach peut être appelée immédiatement.
Ce qui précède est une brève introduction au principe de mise en œuvre de Fody.Costura.
Configuration avancée
Ces configurations sont ajoutées ou modifiées dans CosturaFodyWeavers.xml fichiers.
CreateTemporaryAssemblies Par défaut : faux Cela intègre le fichier intégré sur le disque avant de le charger en mémoire. C’est utile dans certains scénarios où vous souhaitez charger un assembleur à partir d’un fichier physique.
IncludeDebugSymbols Par défaut : vrai Contrôle si les .pdbs de l’assemblage de référence sont également intégrés.
DisableCompression Par défaut : faux Les assemblages embarqués sont compressés par défaut et non compressés lorsqu’ils sont chargés. Vous pouvez désactiver la compression avec cette option. Note : Veillez à désactiver cette propriété lorsque vous consultez des DLL non standard ou des DLL chiffrées. Sinon, cela mènera à la situation où l’exe ne pourra pas être ouvert. Cela a été découvert quand j’utilisais DSkin.dll.
DisableCleanup Par défaut : faux Dans le cadre de Costura, les composants embarqués ne sont plus inclus dans la version. Ce nettoyage peut être désactivé.
LoadAtModuleInit Par défaut : vrai Costura est chargé par défaut dans le cadre de l’initialisation du module. Le drapeau désactive ce comportement. Assure-toi de pouvoir utiliser CosturaUtility.Initialize() quelque part.
ExcludeAssemblies Utilisation : ExcludeAssemblies="DLL1| DLL2" Une liste des noms d’assembleur à exclure de l’action par défaut « intégrer toutes les références locales copiées ».
InclureAssemblées Comment utiliser : IncludeAssemblies="DLL1| DLL2" Une liste des noms d’assemblage inclus dans l’action par défaut d’Intégrer toutes les références locales copiées.
Non géré32Assemblées&Assemblées64 Non gérées Comment l’utiliser : Unmanaged32Assemblies="DLL1| DLL2 » Unmanaged64Assemblies="DLL1| DLL2" Les assemblages en mode mixte ne peuvent pas être chargés de la même manière que les assemblages gérés. Par conséquent, pour aider Costura à identifier quels composants sont en mode mixte et dans quels environnements les charger, leurs noms doivent être inclus dans une ou les deux listes. N’incluez pas .exe ni .dll dans le nom.
PréchargeOrder Utilisation : PreloadOrder="DLL1| DLL2" Les bibliothèques locales peuvent être automatiquement chargées par Costura. Pour inclure une bibliothèque locale, incluez-la dans votre projet sous forme de ressource intégrée appelée dossier costura32 ou costura64 selon l’instabilité de la bibliothèque. Sinon, vous pouvez spécifier l’ordre de chargement dans lequel les bibliothèques préchargées sont chargées. Lorsque vous mélangez des composants temporaires à partir du disque, ils sont aussi préchargés.
CosturaUtility Comment utiliser :
CosturaUtility est une classe qui vous permet d’initialiser manuellement le système Costura dans votre propre code.Cela concerne principalement les scénarios où le programme d’initialisation du module ne fonctionne pas, comme les bibliothèques et le Mono.
Enfin, téléchargez le code source dans le texte :
Touristes, si vous voulez voir le contenu caché de ce post, s’il vous plaît Répondre
|