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

Άποψη: 59779|Απάντηση: 9

[Πηγή] "Δυναμική αντικατάσταση" για προσθήκες .NET

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 2021-8-15 21:55:14 | | |
Φανταστείτε ένα σενάριο όπου το σύστημα υπηρεσιών μας παρέχει μια σειρά λειτουργικών υπηρεσιών και περισσότερες νέες λειτουργικές υπηρεσίες θα προστεθούν στο μέλλον και οι λειτουργικές υπηρεσίες μπορεί να χρειαστεί να αλλάξουν ή να αφαιρεθούν. Μια κοινή βασική απαίτηση για ένα τέτοιο σύστημα υπηρεσιών είναι ότι η λειτουργία του συστήματος υπηρεσιών δεν μπορεί να διακοπεί κατά την προσθήκη/αφαίρεση/ενημέρωση λειτουργικών υπηρεσιών. Κανονικά, τα "hot-swapping plugins" μπορούν να υλοποιηθούν πολύ εύκολα ενσωματώνοντας κάθε υπηρεσία σε ένα πρόσθετο dll, αλλά η "hot replacement" ("δυναμική αντικατάσταση") των plugins γίνεται πρόβλημα. Ο λόγος είναι ότι όταν απεγκαθιστούμε ένα πρόσθετο Dll από το σύστημα υπηρεσιών, το σύστημα υπηρεσιών στην πραγματικότητα εξακολουθεί να διατηρεί την υποκείμενη αναφορά στο dll και αν προσπαθήσετε να διαγράψετε ή να αντικαταστήσετε το dll, τα παράθυρα θα δώσουν ένα μήνυμα όπως "το dll χρησιμοποιείται".

Πώς λοιπόν να λύσετε αυτό το πρόβλημα; Νομίζω ότι υπάρχουν τουλάχιστον δύο επιλογές:

(1) Χρησιμοποιήστε το AppDomain. Η φόρτωση προσθηκών σε ένα νέο AppDomain και στη συνέχεια η απεγκατάσταση του AppDomain καταργεί καθαρά τη φόρτωση των dll προσθηκών από το σύστημα υπηρεσιών. Το μειονέκτημα αυτής της προσέγγισης είναι ότι πρέπει να διαχειριστείτε πολλά AppDomains (επειδή έχετε τόσες πολλές λειτουργικές υπηρεσίες) και η επικοινωνία μεταξύ των AppDomains γίνεται με τρόπο απομακρυσμένης, γεγονός που εισάγει πολλούς περιττούς πονοκεφάλους στο σύστημά μας. Αν σας ενδιαφέρει, μπορείτε επίσης να δοκιμάσετε αυτήν την επιλογή και προτιμώ να χρησιμοποιήσω τη δεύτερη.

(2) Αντιγράψτε το πρόσθετο Dll στη μνήμη και, στη συνέχεια, φορτώστε το Dll στη μνήμη. Με αυτόν τον τρόπο, τα DLL στον σκληρό δίσκο μπορούν να αντικατασταθούν ή να διαγραφούν κατά βούληση. Προηγουμένως φορτώσαμε το πρόσθετο Dll απευθείας από τον σκληρό δίσκο, ως εξής:

Τώρα, πρέπει να στρίψουμε στη γωνία:


Αυτό λύνει το πρόβλημα της «δυναμικής αντικατάστασης» των προσθηκών.





Προηγούμενος:Το Spring Cloud καταγράφει όλα τα αρχεία καταγραφής διεπαφής αιτημάτων στο MongoDB
Επόμενος:Το .NET/C# μετατρέπει τα υπογραμμισμένα ονόματα πεδίων σε μεγάλες μορφές καμπούρας
Δημοσιεύτηκε στις 2021-8-15 23:11:28 |
Ένα τόσο μεγάλο έργο, είναι καλύτερο να κάνετε επανεκκίνηση του διακομιστή τη νύχτα...
Δημοσιεύτηκε στις 2021-8-17 14:43:41 |
Ευχαριστώ που το μοιράστηκες!~'
Δημοσιεύτηκε στις 2021-9-16 18:25:58 |
Απαντήσεις δοκιμής
Δημοσιεύτηκε στις 2021-9-17 21:39:18 |
Μάθε το
Δημοσιεύτηκε στις 2021-9-18 19:05:29 |
Αυτή η ανάρτηση επεξεργάστηκε τελευταία φορά από το fyxh66 στις 2021-9-18 19:07

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 προσπάθησα επίσης, χωρίς @小slag Το αφεντικό έχει χρόνο να βοηθήσει να ρίξει μια ματιά
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 2021-9-18 22:08:32 |
fyxh66 δημοσιεύτηκε στις 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Δεν αντιμετώπισα αυτό το πρόβλημα.

Υπάρχουν δύο περιπτώσεις όπου παρουσιάζεται η εξαίρεση System.BadImageFormatException: η πλατφόρμα προορισμού του προγράμματος είναι ασυνεπής > η πλατφόρμα συστήματος του αρχείου αναφοράς dll είναι ασυνεπής.

Ελεγχος: Είναι συνεπείς οι εκδόσεις .NET του κύριου προγράμματος και των plug-in dll και η πλατφόρμα προορισμού ή τα dll δεν έχουν αναπτυχθεί σε .net;
Δημοσιεύτηκε στις 2021-9-19 16:17:56 |
Δημοσιεύτηκε στις 2021-9-18 22:08
Δεν αντιμετώπισα αυτό το πρόβλημα.

Υπάρχουν δύο περιπτώσεις κατά τις οποίες παρουσιάζεται η εξαίρεση System.BadImageFormatException: η πλατφόρμα προορισμού του προγράμματος είναι ασυνεπής > το dll αναφοράς ...

Ναι, το c++ dll...
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 2021-9-19 17:01:33 |

Αυτό σίγουρα δεν είναι καλό, η δυναμική προσθήκη εδώ μπορεί να φορτώσει μόνο .NET DLL και τα DLL που καλούν C++ δεν προσαρμόζονται με αυτόν τον τρόπο
Δημοσιεύτηκε στις 2021-9-19 18:54:53 |
Xiaozha Δημοσιεύτηκε στις 2021-9-19 17:01
Αυτό σίγουρα δεν είναι καλό, η δυναμική προσθήκη εδώ μπορεί να φορτώσει μόνο .net DLL και τα DLL που καλούν C++ δεν είναι συντονισμένα έτσι...

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

Mail To:help@itsvse.com