Problembeschreibung
Wenn Code, Microsoft.NET Framework 4.5.1 oder Microsoft.NET Framework 4.5.2 und Code dynamisch abzielt, bindet Methoden (z. B. mit einem Skript in Windows PowerShell, IronPython, IronRuby oder einer anderen dynamischen Sprache) System.Runtime.InteropServices.Marshal.SizeOf -Methode oder die System.Runtime.InteropServices.Marshal.PtrToStructure -Methode aufruft, treten möglicherweise die folgenden Probleme.
Hinweis Code, der bereits in eine verwaltete ausführbare Datei kompiliert wird nicht diese Probleme aufweisen, wenn Code dynamic -Schlüsselwort in C# verwendet.
Problem 1
Aufrufe System.Runtime.InteropServices.Marshal.SizeOf Ausnahme die folgenden MethodInvocationException :
Typ "<Type Name>" kann nicht als nicht verwaltete Struktur gemarshallt werden; keine sinnvolle Größe oder Offset berechnet.
Problem 2
Aufrufe System.Runtime.InteropServices.Marshal.PtrToStructure Ausnahme die folgenden MethodInvocationException :
Die angegebene Struktur muss blitfähig oder Layoutinformationen enthalten.
Problem 3
Aufrufe System.Runtime.InteropServices.Marshal.PtrToStructure Ausnahme die folgenden RuntimeBinderException :
Typ 'void', 'Objekt' kann nicht implizit konvertiert werden.
Ursache
Dieses Problem tritt auf, weil Motoren scripting und dynamische Sprachen möglicherweise Binden an eine neue Überladung in.NET Framework eingeführt. Insbesondere Aufrufe, die früher Marshal.SizeOf(Type) können jetzt Marshal.SizeOf < T > (T)und Aufrufe, mit denen Marshal.PtrToStructure (IntPtr, Typ) können jetzt aufgerufen Marshal.PtrToStructure < T >(IntPtr, T). Diese Änderung bewirkt, dass Methoden oder Laufzeitbinder eine Ausnahme ausgelöst.
PROBLEMUMGEHUNG
Um dieses Problem zu umgehen, ändern Sie den Code, damit die richtige Überladung verwendet, wenn Ihre Sprache dazu ermöglicht. Wenn Sie eine bestimmte methodenüberladung angeben können, ändern Sie den Code, damit er die neue methodenüberladung korrekt verwendet.
Für C# dynamischen Aufruf
Hinzufügen einer System.Type innerhalb der SizeOf -Methode oder die Methode PtrToStructure. Beispiel:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Hinweis Dies ist nur erforderlich, wenn eines der Argumente der Methode dynamisch ist.
Windows PowerShell-Skripts
Hinzufügen einer System.Type innerhalb der SizeOf -Methode oder die Methode PtrToStructure. Beispiel:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
IronPython-Skripts
Erstellen Sie eine neue Typinstanz des Typs, und verwenden Sie die neue methodenüberladung. Beispiel:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Status
Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.