Gäller för
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

Symptom

När kod som utnyttjar Microsoft.NET Framework 4.5.1 eller Microsoft.NET Framework 4.5.2 och koden dynamiskt Binder till metoder (t.ex, med hjälp av ett skript i Windows PowerShell, IronPython, IronRuby eller andra dynamiska språk) anropar metoden System.Runtime.InteropServices.Marshal.SizeOf eller metoden System.Runtime.InteropServices.Marshal.PtrToStructure , kan följande problem uppstå.Obs! Kod som redan har kompilerats till en körbar fil för hanterade uppvisar inte problemen, såvida inte den koden använder nyckelordet dynamic i C#.

Problem 1

Anrop till System.Runtime.InteropServices.Marshal.SizeOf kasta MethodInvocationException följande undantag:

Typen ' <namn>' kan inte vara ordnas som en ohanterad struktur. ingen användbar storlek eller offset kan beräknas.

Problem 2

Anrop till System.Runtime.InteropServices.Marshal.PtrToStructure kasta MethodInvocationException följande undantag:

Den angivna strukturen måste vara sammanhängande datablock eller innehålla layoutinformation.

Problem 3

Anrop till System.Runtime.InteropServices.Marshal.PtrToStructure kasta RuntimeBinderException följande undantag:

Det går inte att implicit konvertera typen 'void' till 'object'.

Orsak

Det här problemet uppstår eftersom skriptmotorer och dynamiska språk kan binda till en ny överbelastning som introduceras i.NET Framework. Närmare bestämt samtal som tidigare Marshal.SizeOf(Type) kan nu ringa Marshal.SizeOf < T > (T)och kan nu att ringa samtal som används för Marshal.PtrToStructure (IntPtr, typ) Marshal.PtrToStructure < T >(IntPtr, T). Den här ändringen medför att metoderna eller runtime binder att utlösa ett undantag.

Temporär lösning

Undvik problemet genom att ändra koden så att den använder rätt överbelastning om ditt språk kan du göra detta. Om du inte anger en specifik metod överbelastning kan du ändra koden så att den använder den nya metoden överbelastning på rätt sätt i stället.

För C# dynamiska anrop

Lägga till en uppsättning System.Type i anropet till SizeOf eller PtrToStructure-metoden. Till exempel:

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);

Obs! Detta är bara nödvändigt när ett argument till metoden är dynamisk.

För Windows PowerShell-skript

Lägga till en uppsättning System.Type i anropet till SizeOf eller PtrToStructure-metoden. Till exempel:

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

För IronPython skript

Skapa en ny typ av förekomst av typen och sedan använda den nya metoden överbelastning. Till exempel:

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

Status

Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet "Gäller".

Referenser

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.