Ισχύει για
Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows Server 2008 Service Pack 2 Windows Server 2008 R2 Service Pack 1 Windows 8 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8.1

Συμπτώματα

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

Αναφορές

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

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

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