Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 219600|Απάντηση: 43

[Φόρμα Win] .net/c# Χρησιμοποιήστε το Costura.Fody για να συσκευάσετε το DLL στο EXE

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 14/4/2018 2:41:49 μ.μ. | | | |
Η ανάπτυξη Winform/wpf αναφέρεται αναπόφευκτα σε πολλά DLL τρίτων, αλλά κάθε φορά που το συσκευάζετε, πρέπει να αντιγράφετε τα αρχεία στον κατάλογο εντοπισμού σφαλμάτων στον πελάτη ή να τα μοιράζεστε, κάτι που δεν είναι πολύ βολικό στη χρήση. Έχω δοκιμάσει πολλά λογισμικά για τη συγχώνευση αρχείων dll στο παρελθόν, όπως το ILMerge, το Enigma Virtual Box κ.λπ., αλλά μέχρι να μάθω για το "Costura.Fody", ένιωθα ότι ο κόσμος ήταν πολύ καλύτερος~

Το παρακάτω είναι ένα πρόγραμμα γραμμένο από τη Winform, το οποίο αναφέρεται στα δύο DLL των "HttpHelper.dll" και "Newtonsoft.Json.dll", όταν δημιουργούμε το πρόγραμμα, θα υπάρχει ένα αρχείο exe και αυτά τα δύο αρχεία DLL, γεγονός που κάνει τους ανθρώπους να αισθάνονται πολύ άβολα και εάν υπάρχει ένα λιγότερο DLL, το πρόγραμμα μπορεί να αναφέρει μια εξαίρεση, όπως φαίνεται στο παρακάτω σχήμα:



Ο παρακάτω σύνδεσμος είναι η προηγούμενη χρήση (δεν συνιστάται)

Η C# συσκευάζει το dll στο πρόγραμμα του exe
http://www.itsvse.com/thread-2841-1-1.html
(Πηγή: Architect_Programmer)



Χρησιμοποιώντας το εργαλείο 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.


Τέλος, κατεβάστε τον πηγαίο κώδικα στο κείμενο:

Τουρίστες, αν θέλετε να δείτε το κρυφό περιεχόμενο αυτής της ανάρτησης, παρακαλώΑπάντηση





Προηγούμενος:Λύση StreamReader για αλλοιωμένους χαρακτήρες κατά την ανάγνωση αρχείων
Επόμενος:Λύσεις για διενέξεις μεταξύ Hyper-V και VirtualBox και VMware
Δημοσιεύτηκε στις 7/6/2018 9:35:19 π.μ. |
Δοκιμάστε αυτήν τη μέθοδο σχετικά με την ενσωμάτωση του στοιχείου εξάρτησης Dll στο μεταγλωττισμένο EXE C#!

Εάν είναι εύκολο στη χρήση, θυμηθείτε να το επαινέσετε! Χαχα, αυτό, απλώς προσθέστε Dll στο αρχείο πόρων, απλό και πρακτικό! (Δεν καταλαβαίνω, μπορώ να βρω ένα σεμινάριο) @小渣渣

 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 6/6/2018 10:30:42 π.μ. |
Εάν υπογράψετε ένα πρόγραμμα, θα λάβετε το ακόλουθο σφάλμα:

1>MSBUILD : σφάλμα : Fody: Παρουσιάστηκε μια μη χειριζόμενη εξαίρεση:
1>MSBUILD : σφάλμα : Εξαίρεση:
1>MSBUILD: σφάλμα: Δεν είναι δυνατή η λήψη δημόσιου κλειδιού για το StrongNameKeyPair.
1>MSBUILD : σφάλμα : StackTrace:
1>MSBUILD: σφάλμα: στο System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: σφάλμα: στο System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: σφάλμα: στο Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition module, Disposable'1 stream, WriterParameters parameters)
1>MSBUILD: σφάλμα: στο Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
1>MSBUILD: σφάλμα: Στη θέση InnerWeaver.WriteModule() C:\projects\fody\FodyIsolated\ModuleWriter.cs: αριθμός γραμμής 18
1>MSBUILD: σφάλμα: Στη θέση InnerWeaver.Execute() C:\projects\fody\FodyIsolated\InnerWeaver.cs: αριθμός γραμμής 86
1>MSBUILD : σφάλμα : Πηγή:
1>MSBUILD : σφάλμα : mscorlib
1>MSBUILD : σφάλμα : TargetSite:
1>MSBUILD : σφάλμα : Byte[] ComputePublicKey()
1>MSBUILD : σφάλμα :
1> Fody: Τελείωσε το Fody 551ms.


Δεν φαίνεται να υπάρχει λύση, ανατρέξτε στο άρθρο:

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

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


Μην βασίζεστε σε δυνατά ονόματα για να παραμείνετε ασφαλείς.

Επομένως, φαίνεται άσκοπο να κάνουμε το παραπάνω μίλι για να προστατεύσουμε κάτι που δεν είναι χαρακτηριστικό ασφαλείας

 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 17/4/2018 1:02:12 μ.μ. |
xxhh Δημοσιεύτηκε στις 2018-4-17 11:35
Μετά την εγκατάσταση του Costura.Fody απευθείας στο vs NuGet, έσυρα ένα πρόγραμμα αναπαραγωγής Windows Media Playe για να δημιουργήσω δύο ενσωματωμένα dll για διαγραφή ή αναφορά...

Τα στοιχεία ελέγχου του Windows Media Player είναι στοιχεία com, δεν ξέρω αν το "Costura.Fody" τα υποστηρίζει.

1: Θα πρέπει να δείτε εάν το "Costura.Fody" υποστηρίζει "com components"
2: Αγνοήστε τα δύο DLL που είναι συσκευασμένα, καθώς θα πρέπει να οριστεί ο τρόπος παράβλεψης xml, ανατρέξτε στην επίσημη τεκμηρίωση για λεπτομέρειες
Δημοσιεύτηκε στις 17/4/2018 10:29:52 π.μ. |
Κάντε λήψη για να δείτε τις ρυθμίσεις XML
Δημοσιεύτηκε στις 17/4/2018 10:33:34 π.μ. |
Ο ιδιοκτήτης θέλει να σας ρωτήσει αν μπορώ να συγκεντρώσω το βίντεο και το dll σε ένα πρόσθετο exe
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 17/4/2018 11:16:15 π.μ. |
xxhh Δημοσιεύτηκε στις 2018-4-17 10:33
Ο ιδιοκτήτης θέλει να σας ρωτήσει αν μπορώ να συγκεντρώσω το βίντεο και το dll σε ένα πρόσθετο exe
...

Μπορείτε να το κάνετε αυτό, μπορείτε να ορίσετε την ιδιότητα βίντεο σε "Ενσωματωμένοι πόροι" και, στη συνέχεια, να διαβάσετε το αρχείο πόρου.
Δημοσιεύτηκε στις 17/4/2018 11:35:51 π.μ. |
Xiao Zhao Δημοσιεύτηκε στις 2018-4-17 11:16
Μπορείτε να το κάνετε αυτό, μπορείτε να ορίσετε την ιδιότητα βίντεο σε "Ενσωματωμένοι πόροι" και, στη συνέχεια, να διαβάσετε το αρχείο πόρου. ...

Έσυρα ένα πρόγραμμα αναπαραγωγής Windows Media Playe αμέσως μετά την εγκατάσταση του Costura.Fody στο vs NuGet και δημιούργησα δύο ενσωματωμένα dll για να διαγράψω ή να αναφέρω ένα σφάλμα  
Δημοσιεύτηκε στις 17/4/2018 11:57:09 π.μ. |
Χρειάζεται ακόμα να οριστεί XML;     
Δημοσιεύτηκε στις 17/4/2018 5:42:31 μ.μ. |
Xiao Zhao Δημοσιεύτηκε στις 2018-4-17 11:16
Μπορείτε να το κάνετε αυτό, μπορείτε να ορίσετε την ιδιότητα βίντεο σε "Ενσωματωμένοι πόροι" και, στη συνέχεια, να διαβάσετε το αρχείο πόρου. ...

Ιδιοκτήτης ή εγώ, θέλω να ρωτήσω, βάζω το βίντεο στον ενσωματωμένο πόρο, αυτό που διαβάζει είναι ένας πίνακας byte, υπάρχει κάποιος τρόπος να το βάλω στη συσκευή αναπαραγωγής και να το παίξω απευθείας (δεν θέλω να γράψω στον τοπικό για αναπαραγωγή στη διαδρομή ανάγνωσης, το βίντεο είναι κάτι περισσότερο από τη μεγάλη κάρτα)
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 17/4/2018 8:52:16 μ.μ. |
Δημοσιεύτηκε στις 2018-4-17 17:42
Ο ιδιοκτήτης ή εγώ, θέλω να ρωτήσω, βάζω το βίντεο στον ενσωματωμένο πόρο και αυτό που διαβάζει είναι ένας πίνακας byte, υπάρχει κάποιος τρόπος να το βάλω στη συσκευή αναπαραγωγής και να το παίξω απευθείας ( ...

Δεν συνιστάται η δημιουργία ενός μεγάλου βίντεο σε αρχείο πόρων, μπορείτε να δείτε εάν υπάρχει άλλος τρόπος για να περάσει απευθείας η συσκευή αναπαραγωγής σε byte[]
Δημοσιεύτηκε στις 18/4/2018 8:08:48 π.μ. |
Xiao Zhazha Δημοσιεύτηκε στις 2018-4-17 20:52
Δεν συνιστάται η δημιουργία ενός μεγάλου βίντεο σε αρχείο πόρων, μπορείτε να δείτε εάν υπάρχει άλλος τρόπος για να περάσει απευθείας η συσκευή αναπαραγωγής σε byte[] ...

Κανένας από αυτούς δεν διαβάζει διευθύνσεις βίντεο και δεν θέλει να σας ρωτήσει τι καλές ιδέες έχετε
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com