Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 219600|Répondre: 43

[WinForm] .net/c# Utilisez Costura.Fody pour empaqueter les DLL dans l’EXE

[Copié le lien]
Publié sur 14/04/2018 14:41:49 | | | |
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)

C# empaquete la dll dans le programme de l’exécutif
http://www.itsvse.com/thread-2841-1-1.html
(Source : Architect_Programmer)



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îtRépondre





Précédent:Solution StreamReader pour les caractères brouillés lors de la lecture de fichiers
Prochain:Solutions aux conflits entre Hyper-V, VirtualBox et VMware
Publié sur 07/06/2018 09:35:19 |
Essayez cette méthode pour intégrer le composant de dépendance Dll dans un EXE compilé en C# !

Si c’est facile à utiliser, n’oubliez pas de le féliciter ! Haha, ça, il suffit d’ajouter Dll au fichier de ressources, simple et pratique ! (Je ne comprends pas, je peux inventer un tutoriel) @小渣渣

 Propriétaire| Publié sur 06/06/2018 10:30:42 |
Si vous signez un programme, vous recevrez l’erreur suivante :

1>MSBUILD : erreur : Fody : Une exception non traitée s’est produite :
1>MSBUILD : erreur : Exception :
1>MSBUILD : erreur : impossible d’obtenir une clé publique pour StrongNameKeyPair.
1>MSBUILD : erreur : StackTrace :
1>MSBUILD : erreur : at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD : erreur : in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD : erreur : in Mono.Cecil.ModuleWriter.WriteModuleTo(module moduleDefinition, flux Disposable'1, paramètres WriterParameters)
1>MSBUILD : erreur : dans Mono.Cecil.ModuleDefinition.Write(String fileName, paramètres WriterParameters)
1>MSBUILD : erreur : In InnerWeaver.WriteModule() position C :\projects\fody\FodyIsolated\ModuleWriter.cs : ligne numéro 18
1>MSBUILD : erreur : In InnerWeaver.Execute() position C :\projects\fody\FodyIsolated\InnerWeaver.cs : ligne numéro 86
1>MSBUILD : erreur : Source :
1>MSBUILD : erreur : mscorlib
1>MSBUILD : erreur : TargetSite :
1>MSBUILD : erreur : Byte[] ComputePublicKey()
1>MSBUILD : erreur :
1> Fody : Fody terminé 551ms.


Il ne semble pas y avoir de solution, voir l’article :

https://github.com/Fody/ExtraConstraints/issues/5

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


Ne comptez pas sur des noms forts pour rester en sécurité.

Il semble donc inutile d’aller plus loin pour protéger quelque chose qui n’est pas une fonctionnalité de sécurité

 Propriétaire| Publié sur 17/04/2018 13:02:12 |
xxhh Publié le 17-04-2018 à 11:35
Après avoir installé Costura.Fody directement contre NuGet, j’ai glissé un lecteur Windows Media Playe pour générer deux DLL intégrés à supprimer ou signaler...

Les contrôles de Windows Media Player sont des composants com, je ne sais pas si « Costura.Fidy » les supporte.

1 : Vous devriez vérifier si « Costura.Fody » prend en charge les « com components »
2 : Ignorez les deux DLL qui sont emballées, car pour savoir comment ignorer le xml doit être défini, veuillez consulter la documentation officielle pour plus de détails
Publié sur 17/04/2018 10:29:52 |
Téléchargez pour voir la configuration XML
Publié sur 17/04/2018 10:33:34 |
Le propriétaire veut vous demander si je peux mettre la vidéo et le dll ensemble dans un plugin exe
 Propriétaire| Publié sur 17/04/2018 11:16:15 |
xxhh Publié le 17-04-2018 à 10:33
Le propriétaire veut vous demander si je peux mettre la vidéo et le dll ensemble dans un plugin exe
...

Vous pouvez le faire, vous pouvez définir la propriété vidéo sur « Ressources intégrées », puis lire le fichier de ressources.
Publié sur 17/04/2018 11:35:51 |
Xiao Zhao a posté le 17/04/2018 à 11:16
Vous pouvez le faire, vous pouvez définir la propriété vidéo sur « Ressources intégrées », puis lire le fichier de ressources. ...

J’ai glissé un lecteur Windows Media Playe directement après avoir installé Costura.Fody dans le lieu de NuGet et j’ai produit deux DLL intégrés pour supprimer ou signaler une erreur  
Publié sur 17/04/2018 11:57:09 |
Le XML doit-il encore être défini ?     
Publié sur 17/04/2018 17:42:31 |
Xiao Zhao a posté le 17/04/2018 à 11:16
Vous pouvez le faire, vous pouvez définir la propriété vidéo sur « Ressources intégrées », puis lire le fichier de ressources. ...

Propriétaire ou moi, je veux demander, je mets la vidéo dans la ressource intégrée, ce qui se lit est un tableau d’octets, y a-t-il un moyen de le mettre dans le lecteur et de le lire directement (je ne veux pas écrire sur le site local pour lire dans le chemin de lecture, la vidéo est plus que la grosse carte)
 Propriétaire| Publié sur 17/04/2018 20:52:16 |
xxhh Publié le 17-04-2018 à 17:42
Propriétaire ou moi, je veux demander, j’ai mis la vidéo dans la ressource intégrée, et ce qui s’affiche est un tableau d’octets, y a-t-il un moyen de le mettre dans le lecteur et de le lire directement ( ...

Il n’est pas recommandé de transformer une grande vidéo en fichier ressource, vous pouvez voir s’il existe un autre moyen pour le lecteur de passer directement dans l’octet[]
Publié sur 18/04/2018 08:08:48 |
Xiao Zhazha Publié le 17-04-2018 à 20:52
Il n’est pas recommandé de transformer une grande vidéo en fichier ressource, vous pouvez voir s’il existe une autre façon pour le lecteur de passer directement en octet[] ...

Aucun d’eux ne lit les adresses vidéo et ne veut vous demander quelles bonnes idées vous avez
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com