Η ανάπτυξη Winform/wpf αναφέρεται αναπόφευκτα σε πολλά DLL τρίτων, αλλά κάθε φορά που το συσκευάζετε, πρέπει να αντιγράφετε τα αρχεία στον κατάλογο εντοπισμού σφαλμάτων στον πελάτη ή να τα μοιράζεστε, κάτι που δεν είναι πολύ βολικό στη χρήση. Έχω δοκιμάσει πολλά λογισμικά για τη συγχώνευση αρχείων dll στο παρελθόν, όπως το ILMerge, το Enigma Virtual Box κ.λπ., αλλά μέχρι να μάθω για το "Costura.Fody", ένιωθα ότι ο κόσμος ήταν πολύ καλύτερος~
Το παρακάτω είναι ένα πρόγραμμα γραμμένο από τη Winform, το οποίο αναφέρεται στα δύο DLL των "HttpHelper.dll" και "Newtonsoft.Json.dll", όταν δημιουργούμε το πρόγραμμα, θα υπάρχει ένα αρχείο exe και αυτά τα δύο αρχεία DLL, γεγονός που κάνει τους ανθρώπους να αισθάνονται πολύ άβολα και εάν υπάρχει ένα λιγότερο DLL, το πρόγραμμα μπορεί να αναφέρει μια εξαίρεση, όπως φαίνεται στο παρακάτω σχήμα:
Ο παρακάτω σύνδεσμος είναι η προηγούμενη χρήση (δεν συνιστάται)
Χρησιμοποιώντας το εργαλείο Costura.Fody, μπορείτε να συγχωνεύσετε το DLL προέλευσης στο EXE προορισμού
Αρχική σελίδα έργου: https://github.com/Fody/Costura
Πώς να χρησιμοποιήσετε, να εγκαταστήσετε απευθείας το πακέτο nuget:
Μόλις προσθέσετε με επιτυχία το Costura.Fody, η λύση θα προσθέσει αυτόματα FodyWeavers.xml αρχείο.
Δημιουργήστε ξανά τη λύση, μπορείτε να δείτε την επιτυχία σας στον κατάλογο δημιουργίας προγράμματος, όλα τα DLL συγχωνεύονται τέλεια στο exe, μπορείτε να αντιγράψετε απευθείας το αρχείο exe στον πελάτη για να εκτελεστεί ανεξάρτητα. Οπως φαίνεται παρακάτω:
1>------ Όλες οι ανακατασκευές έχουν ξεκινήσει: Έργο: itsvse, Διαμόρφωση: Εντοπισμός σφαλμάτων οποιασδήποτε CPU ------ 1> Fody: Fody (έκδοση 2.0.0.0) Εκτέλεση 1> Fody/Costura: Δεν βρέθηκε καμία αναφορά στο «Costura.dll». Οι παραπομπές δεν τροποποιήθηκαν. 1> Fody/Costura: Ενσωμάτωση 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Ενσωμάτωση 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Τελείωσε το Fody 609ms. 1> Fody: Παραλείφθηκε η συναρμολόγηση επαλήθευσης καθώς είναι απενεργοποιημένη στη διαμόρφωση 1> Fody: Ολοκληρώθηκε η επαλήθευση σε 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Αναγέννηση όλων: 1 επιτυγχάνει, 0 αποτυγχάνει και 0 ========== παραλείπεται
Όπως φαίνεται από την παραπάνω εικόνα, το αρχείο που δημιουργείται δεν περιέχει Newtonsoft.Json.dll, HttpHelper.dll και Costura.dll δεν δημιουργούνται, μόνο δύο αρχεία itsvse.exe μπορούν να εκτελεστούν απευθείας χωρίς σφάλματα! (Το αρχείο PDB μπορεί να διαγραφεί).
Ας χρησιμοποιήσουμε το εργαλείο ILSpy για να απομεταγλωττίσουμε το πρόγραμμά μας και να ρίξουμε μια ματιά στον πηγαίο κώδικα που δημιουργήθηκε, όπως φαίνεται στο παρακάτω σχήμα:
Εισαγωγή στην αρχή εφαρμογής
Όταν το CLR προσπαθεί να φορτώσει μια συγκρότηση αλλά αποτυγχάνει να φορτώσει, προκαλεί το συμβάν AppDomain.AssemblyResolve. Το πρόγραμμά μας μπορεί να ακούσει αυτό το συμβάν και να επιστρέψει τη συγκρότηση που προσπαθεί να φορτώσει το CLR στο πρόγραμμα χειρισμού συμβάντων, έτσι ώστε το πρόγραμμα να συνεχίσει να λειτουργεί κανονικά.
Το Fody.Costura ενσωματώνει όλα τα DLL που αναφέρονται από το EXE στο αρχείο EXE κατά την κατασκευή του έργου. Όταν ένα πρόγραμμα χρησιμοποιεί ένα από αυτά τα DLL κατά την εκτέλεση (το συμβάν AppDomain.AssemblyResolve ενεργοποιείται επειδή το CLR δεν μπορεί να εντοπίσει το αρχείο DLL), το απαιτούμενο DLL εξάγεται από τους ενσωματωμένους πόρους του αρχείου EXE.
Μπορείτε να δείτε ότι η μέθοδος Attach ακούει το συμβάν AppDomain.AssemblyResolve. Όταν το CLR αποτυγχάνει να φορτώσει με επιτυχία μια συγκρότηση, εκτελείται το πρόγραμμα χειρισμού συμβάντων AssemblyResolve. Το AssemblyResolve επιχειρεί να λάβει τη συγκρότηση προορισμού από τον ενσωματωμένο πόρο της φορτωμένης συγκρότησης μέσω της μεθόδου Common.ReadFromEmbeddedResources και την επιστρέφει στο CLR.
Βλέποντας αυτό, μπορείτε να ρωτήσετε, πότε εφαρμόστηκε η μέθοδος Επισύναψη;
Στην πραγματικότητα, για τη γλώσσα C#, το CLR κρύβει ένα μεγάλο κόλπο - το CLR μπορεί να εκτελέσει κάποιο αρχικοποιημένο κώδικα πριν φορτωθεί κάθε ενότητα (κάθε συγκρότημα περιέχει μία ή περισσότερες ενότητες). Δυστυχώς, η γλώσσα C# δεν έχει κανέναν έλεγχο σε αυτό το τμήμα του κώδικα. Το Fody.Costura εισάγει κώδικα IL απευθείας στη συνάρτηση προετοιμασίας της εσωτερικής μονάδας του συγκροτήματος EXE και αυτό το τμήμα του κώδικα IL εκτελεί στην πραγματικότητα τη μέθοδο Attagg. Με αυτόν τον τρόπο, μόλις φορτωθεί το συγκρότημα EXE, η μέθοδος Attach μπορεί να κληθεί αμέσως.
Τα παραπάνω είναι μια σύντομη εισαγωγή στην αρχή υλοποίησης του Fody.Costura.
Προηγμένη διαμόρφωση
Αυτές οι διαμορφώσεις προστίθενται ή τροποποιούνται σε CosturaFodyWeavers.xml αρχεία.
ΔημιουργίαΠροσωρινώνΣυγκροτήσεων Προεπιλογή: false Αυτό ενσωματώνει το ενσωματωμένο αρχείο στο δίσκο πριν το φορτώσει στη μνήμη. Αυτό είναι χρήσιμο για ορισμένα σενάρια όπου θέλετε να φορτώσετε μια συγκρότηση από ένα φυσικό αρχείο.
IncludeDebugSymbols Προεπιλογή: true Ελέγχει εάν τα .pdbs του συγκροτήματος αναφοράς είναι επίσης ενσωματωμένα.
ΑπενεργοποίησηΣυμπίεση Προεπιλογή: false Τα ενσωματωμένα συγκροτήματα συμπιέζονται από προεπιλογή και αποσυμπιέζονται όταν φορτώνονται. Μπορείτε να απενεργοποιήσετε τη συμπίεση χρησιμοποιώντας αυτήν την επιλογή. Σημείωση: Βεβαιωθείτε ότι έχετε απενεργοποιήσει αυτήν την ιδιότητα όταν αναφέρεστε σε μη τυπικά DLL ή κρυπτογραφημένα DLL. Διαφορετικά, θα οδηγήσει στην κατάσταση ότι το exe δεν μπορεί να ανοίξει. Αυτό ανακαλύφθηκε όταν χρησιμοποιούσα DSkin.dll.
ΑπενεργοποίησηΕκκαθάριση Προεπιλογή: false Ως μέρος του Costura, τα ενσωματωμένα στοιχεία δεν περιλαμβάνονται πλέον στην κατασκευή. Αυτή η εκκαθάριση μπορεί να απενεργοποιηθεί.
LoadAtModuleInit Προεπιλογή: true Το Costura φορτώνεται από προεπιλογή ως μέρος της προετοιμασίας της ενότητας. Η σημαία απενεργοποιεί τη συμπεριφορά. Βεβαιωθείτε ότι μπορείτε να χρησιμοποιήσετε κάπου το CosturaUtility.Initialize().
ExcludeAssemblies Τρόπος χρήσης: ExcludeAssemblies="DLL1| DLL2" Μια λίστα ονομάτων συγκροτημάτων που πρέπει να εξαιρεθούν από την προεπιλεγμένη ενέργεια "ενσωμάτωση όλων των τοπικών αναφορών αντιγραφής".
ΣυμπερίληψηΣυνελεύσεις Τρόπος χρήσης: IncludeAssemblies="DLL1| DLL2" Μια λίστα με τα ονόματα συγκροτημάτων που περιλαμβάνονται στην προεπιλεγμένη ενέργεια της ενσωμάτωσης όλων των τοπικών αναφορών αντιγραφής.
Μη διαχειριζόμενα32Συγκροτήματα&Μη διαχειριζόμενα64Συγκροτήματα Πώς να το χρησιμοποιήσετε: Unmanaged32Assemblies="DLL1| DLL2" Μη διαχειριζόμενη64Assemblies="DLL1| DLL2" Τα συγκροτήματα μεικτής λειτουργίας δεν μπορούν να φορτωθούν με τον ίδιο τρόπο όπως τα διαχειριζόμενα συγκροτήματα. Επομένως, για να βοηθήσει την Costura να προσδιορίσει ποια στοιχεία βρίσκονται σε μικτή λειτουργία και σε ποια περιβάλλοντα να τα φορτώσει, τα ονόματά τους θα πρέπει να συμπεριληφθούν σε μία ή και στις δύο λίστες. Μην συμπεριλάβετε .exe ή .dll στο όνομα.
ΠροφόρτωσηΠαραγγελία Χρήση: PreloadOrder="DLL1| DLL2" Οι τοπικές βιβλιοθήκες μπορούν να φορτωθούν αυτόματα από την Costura. Για να συμπεριλάβετε μια τοπική βιβλιοθήκη, συμπεριλάβετέ την στο έργο σας ως ενσωματωμένο πόρο που ονομάζεται φάκελος costura32 ή costura64 ανάλογα με την αστάθεια της βιβλιοθήκης. Εναλλακτικά, μπορείτε να καθορίσετε τη σειρά φόρτωσης με την οποία φορτώνονται οι προφορτωμένες βιβλιοθήκες. Όταν αναμιγνύετε προσωρινά στοιχεία από δίσκο, είναι επίσης προφορτωμένα.
CosturaUtility Τρόπος χρήσης:
Το CosturaUtility είναι μια κλάση που σας επιτρέπει να αρχικοποιήσετε χειροκίνητα το σύστημα Costura στον δικό σας κώδικα.Αυτό ισχύει κυρίως για σενάρια όπου το πρόγραμμα προετοιμασίας της μονάδας δεν λειτουργεί, όπως βιβλιοθήκες και Mono.
Τέλος, κατεβάστε τον πηγαίο κώδικα στο κείμενο:
Τουρίστες, αν θέλετε να δείτε το κρυφό περιεχόμενο αυτής της ανάρτησης, παρακαλώ Απάντηση
|