Συμπτώματα
Όταν κώδικα που στοχεύει δυναμικά το 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 που παρατίθενται στην ενότητα "Ισχύει για".