Uitzonderingen in Windows PowerShell andere dynamische talen en dynamisch uitgevoerde C#-code als sommige methoden wordt aangeroepen code die gericht is op het .NET Framework

Symptomen

Wanneer code die gericht is op het Microsoft .NET Framework 4.5.1 of Microsoft .NET Framework 4.5.2 en de code dynamisch aan gebonden methoden (bijvoorbeeld met behulp van een script in Windows PowerShell, IronPython, IronRuby of een andere dynamische taal) roept de methode System.Runtime.InteropServices.Marshal.SizeOf of System.Runtime.InteropServices.Marshal.PtrToStructure , kunnen de volgende problemen optreden.

Opmerking Code die reeds is gecompileerd naar een beheerde uitvoerbare vertonen deze problemen, tenzij die code gebruikt het gereserveerde woord dynamic in C#.

Probleem 1

Aanroepen van System.Runtime.InteropServices.Marshal.SizeOf de volgende MethodInvocationException uitzondering genereren:

Type ' <naam>' kan niet worden samengevoegd als niet-begeleide structuur; geen relevante grootte of offset worden berekend.

Probleem 2

Aanroepen van System.Runtime.InteropServices.Marshal.PtrToStructure de volgende MethodInvocationException uitzondering genereren:

De opgegeven structuur moet blittable of informatie over de opmaak hebben.


Probleem 3

Aanroepen van System.Runtime.InteropServices.Marshal.PtrToStructure de volgende RuntimeBinderException uitzondering genereren:

Kan het type void naar 'object' impliciet converteren.


Oorzaak

Dit probleem treedt op omdat de script-engines en dynamische talen wordt gebonden aan een nieuwe overbelasting die is geïntroduceerd in het .NET Framework. Met name oproepen die vroeger Marshal.SizeOf(Type) kunnen nu bellen Marshal.SizeOf < T > (T)en gesprekken die Marshal.PtrToStructure (IntPtr, Type gebruikt) kunnen nu een beroep doen Marshal.PtrToStructure < T >(IntPtr, T). Deze wijziging zorgt ervoor dat de methoden of in de binder runtime een uitzondering.

Tijdelijke oplossing

U kunt dit probleem omzeilen, moet u de code wijzigen zodat de juiste overbelasting wordt gebruikt als uw taal, kunt u dit doen. Als u een specifieke methode overbelasting opgeven kunt, de code wijzigen zodat deze de nieuwe methode overbelasting goed in plaats daarvan.

Voor dynamische aanroep C#

Cast aan System.Type toevoegen in de aanroep van de methode SizeOf of 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 wanneer een van de argumenten van de methode dynamisch is.

Voor Windows PowerShell-scripts

Cast aan System.Type toevoegen in de aanroep van de methode SizeOf of PtrToStructure. Bijvoorbeeld:

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

Voor scripts IronPython

Maak een nieuw exemplaar van het type en gebruik vervolgens de nieuwe methode overbelasting. Bijvoorbeeld:

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

Status

Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'.

Referenties

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×