Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Συμπτώματα

Όταν κώδικα που στοχεύει δυναμικά το Microsoft .NET Framework 4.5.1 ή το Microsoft .NET Framework 4.5.2 και ο κώδικας συνδέει με μεθόδους (για παράδειγμα, χρησιμοποιώντας μια δέσμη ενεργειών του Windows PowerShell, IronPython, IronRuby ή άλλη γλώσσα δυναμικό) καλεί τη μέθοδο System.Runtime.InteropServices.Marshal.SizeOf ή τη μέθοδο System.Runtime.InteropServices.Marshal.PtrToStructure , ενδέχεται να αντιμετωπίσετε τα ακόλουθα ζητήματα.

Σημείωση Κώδικα που ήδη έχει μεταγλωττιστεί σε ένα εκτελέσιμο αρχείο διαχειριζόμενης δεν παρουσιάζει αυτά τα ζητήματα, εκτός εάν αυτός ο κώδικας χρησιμοποιεί τη δυναμική λέξη-κλειδί σε C#.

Πρόβλημα 1

Κλήσεις σε System.Runtime.InteropServices.Marshal.SizeOf throw η παρακάτω εξαίρεση MethodInvocationException :

Τύπος ' <όνομα τύπου>' δεν είναι δυνατό να παραταχθεί ως μια μη διαχειριζόμενη δομή. χωρίς νόημα μέγεθος ή μετατόπιση μπορεί να υπολογιστεί.

Πρόβλημα 2

Κλήσεις σε System.Runtime.InteropServices.Marshal.PtrToStructure throw η παρακάτω εξαίρεση MethodInvocationException :

Η καθορισμένη δομή πρέπει να έχει δυνατότητα πλήρωσης ή να έχει πληροφορίες διάταξης.


Πρόβλημα 3

Κλήσεις σε System.Runtime.InteropServices.Marshal.PtrToStructure throw η παρακάτω εξαίρεση RuntimeBinderException :

Έμμεσα δεν είναι δυνατή η μετατροπή του τύπου 'void' σε 'object'.


Αιτία

Αυτό το ζήτημα παρουσιάζεται επειδή μηχανισμούς δέσμης ενεργειών και δυναμική γλώσσες μπορεί να συνδεθεί με ένα νέο υπερφόρτωσης που έχει εισαχθεί στο .NET Framework. Ειδικότερα, κλήσεις που προηγουμένως χρησιμοποιούσαν Marshal.SizeOf(Type) τώρα μπορεί να καλέσει Marshal.SizeOf < T > (T)και τώρα μπορεί να καλέσει κλήσεις που χρησιμοποιούνται Marshal.PtrToStructure (IntPtr, τύπος) Marshal.PtrToStructure < T >(IntPtr, T). Αυτή η αλλαγή προκαλεί τις μεθόδους ή το ντοσιέ κατά το χρόνο εκτέλεσης για να δημιουργήσει μια εξαίρεση.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτό το ζήτημα, μπορείτε να αλλάξετε τον κωδικό έτσι ώστε να χρησιμοποιεί το σωστό υπερφόρτωση, εάν η γλώσσα σας σάς δίνει τη δυνατότητα να το κάνετε αυτό. Εάν δεν μπορείτε να καθορίσετε μια συγκεκριμένη μέθοδος υπερφόρτωση, αλλάξετε τον κωδικό, έτσι ώστε να χρησιμοποιεί τη νέα μέθοδο υπερφόρτωση σωστά στη θέση.

Για ενεργοποίηση δυναμικών C#

Προσθέστε μια απόκλιση System.Type κατά την κλήση προς τη μέθοδο SizeOf ή τη μέθοδο PtrToStructure. Για παράδειγμα:

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);


Σημείωση Αυτό είναι απαραίτητο μόνο όταν ένα από τα ορίσματα της μεθόδου είναι δυναμική.

Για δέσμες ενεργειών των Windows PowerShell

Προσθέστε μια απόκλιση System.Type κατά την κλήση προς τη μέθοδο SizeOf ή τη μέθοδο PtrToStructure. Για παράδειγμα:

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

Για δέσμες ενεργειών IronPython

Δημιουργήστε μια νέα περίοδο λειτουργίας του τύπου του τύπου και, στη συνέχεια, να χρησιμοποιήσετε τη νέα μέθοδο υπερφόρτωση. Για παράδειγμα:

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα των προϊόντων της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".

Αναφορές

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×