Logga in med Microsoft
Logga in eller skapa ett konto.
Hej,
Välj ett annat konto.
Du har flera konton
Välj det konto som du vill logga in med.

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.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.

Hade du nytta av den här informationen?

Hur nöjd är du med språkkvaliteten?
Vad påverkade din upplevelse?
Genom att trycka på skicka, kommer din feedback att användas för att förbättra Microsofts produkter och tjänster. IT-administratören kan samla in denna data. Sekretesspolicy.

Tack för din feedback!

×