Symptomen
Wanneer code die is gericht op Microsoft .NET Framework 4.5.1 of Microsoft .NET Framework 4.5.2, en de code dynamisch is gebonden aan methoden (bijvoorbeeld met behulp van een script in Windows PowerShell, IronPython, IronRuby of een andere dynamische taal), de System.Runtime.InteropServices.Marshal.SizeOf-methode of de System.Runtime.InteropServices.Marshal.PtrToStructure kunt u de volgende problemen ondervinden.
Opmerking Code die al is gecompileerd in een beheerd uitvoerbaar bestand vertoont deze problemen niet, tenzij in die code het dynamische sleutelwoord in C# wordt gebruikt.
Probleem 1
Aanroepen naar System.Runtime.InteropServices.Marshal.SizeOf gooien de volgende MethodInvocationException-uitzondering:
Opmerking
Type '<Type name>' kan niet worden geordend als een onbeheerde structuur; er kan geen zinvolle grootte of offset worden berekend.
Probleem 2
Aanroepen naar System.Runtime.InteropServices.Marshal.PtrToStructure genereren de volgende MethodInvocationException-uitzondering:
Opmerking
De opgegeven structuur moet blittable zijn of lay-outinformatie bevatten.
Probleem 3
Aanroepen naar System.Runtime.InteropServices.Marshal.PtrToStructure genereren de volgende RuntimeBinderException-uitzondering:
Opmerking
Typ 'void' niet impliciet naar 'object'.
Oorzaak
Dit probleem treedt op omdat scriptengines en dynamische talen mogelijk afhankelijk zijn van een nieuwe overbelasting die in het .NET Framework wordt geïntroduceerd. In het bijzonder kunnen aanroepen die voorheen Marshal.SizeOf(Type) gebruikten nu Marshal.SizeOf<T>(T) aanroepen, en aanroepen die Marshal.PtrToStructure(IntPtr, Type) gebruikten, mogen nu Marshal.PtrToStructure<T>(IntPtr, T) aanroepen. Deze wijziging zorgt ervoor dat de methoden of de runtimemap een uitzondering genereren.
Tijdelijke oplossing
U kunt dit probleem omzeilen door de code zodanig te wijzigen dat deze de juiste overbelasting gebruikt, als uw taal dit toestaat. Als u geen specifieke methode overbelasting kunt opgeven, wijzigt u de code zodat deze de nieuwe methode overbelasting correct gebruikt.
Voor C# Dynamic Invocation
Voeg een cast toe aan System.Type in de aanroep naar methode SizeOf of method PtrToStructure. Bijvoorbeeld:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);
int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Opmerking: Dit is alleen nodig als een van de argumenten voor de methode dynamisch is.
Voor Windows PowerShell-scripts
Voeg een cast toe aan System.Type in de aanroep naar methode SizeOf of method PtrToStructure. Bijvoorbeeld:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Voor IronPython-scripts
Maak een nieuw type-exemplaar van het type en gebruik vervolgens de nieuwe methode overload. Bijvoorbeeld:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Status
Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in de sectie Van toepassing op.