Uitzonderingen in Windows PowerShell, andere dynamische talen en dynamisch uitgevoerde C#-code wanneer code die gericht is op het .NET Framework bepaalde methoden aanroept

Van toepassing op
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

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.

Meer informatie