Applies ToWindows 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

Požymiai

Kai Microsoft .NET Framework 4.5.1 arba Microsoft .NET Framework 4.5.2, ir kodas dinamiškai prisijungia prie metodus (pavyzdžiui, naudojant "Windows PowerShell", IronPython, IronRuby ar kitos kalbos scenarijų) vadinaSystem.Runtime.InteropServices.Marshal.SizeOf metodą arba System.Runtime.InteropServices.Marshal.PtrToStructure , jūs gali susidurti su šiomis problemomis.Pastaba. Kodas, kuris jau yra sudarytas į valdomų vykdomąjį failą neturi būti šios problemos, nebent kad kodas naudoja dinaminio raktažodžių C#.

1 problema

Kvietimus į vadinaSystem.Runtime.InteropServices.Marshal.SizeOf mesti šį MethodInvocationException išimtis:

"<Tipo pavadinimas>" negali būti kontroliuojama kaip nekontroliuojamiems struktūra; nėra reikšmingas dydžio ir poslinkis gali būti apskaičiuota.

2 problema

Kvietimus į System.Runtime.InteropServices.Marshal.PtrToStructure mesti šį MethodInvocationException išimtis:

Nurodytas struktūra turi būti blittable arba išdėstymo informaciją.

3 problema

Kvietimus į System.Runtime.InteropServices.Marshal.PtrToStructure mesti šį RuntimeBinderException išimtis:

Netiesiogiai negali konvertuoti tipo "atšaukti", "objektas".

Priežastis

Ši problema kyla, nes scenarijus varikliai ir dinamiškas kalbų gali susieti su nauja perkrovos, kuri yra įtraukta į .NET Framework. Konkrečiai, ragina, kad anksčiau naudoti Marshal.SizeOf(Type) dabar gali skambinti Marshal.SizeOf < T > (T), ir ragina, kad naudojami Marshal.PtrToStructure (IntPtr, tipo) gali dabar vadiname Marshal.PtrToStructure < T >(IntPtr, T). Šis pakeitimas sukelia metodus arba runtime segtuvo mesti išimtis.

Sprendimas

Norėdami išspręsti šią problemą, pakeisti kodą, kad jį naudoja teisingą perkrovos jei jūsų kalba suteikia galimybę tai padaryti. Jei negalima nurodyti konkretaus metodo perkrovos, pakeisti kodą, kad jį naudoja naujas metodas perkrovos teisingai vietoj.

Dėl C# dinaminis pritaikymo

Pridėti dauguma System.Type Atsidarê metodas SizeOf arba metodą PtrToStructure. Pvz.:

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

Pastaba. Tai tik būtina, kai vienas iš argumentų, kuriais metodas yra dinamiškas.

"Windows PowerShell" scenarijų

Pridėti dauguma System.Type Atsidarê metodas SizeOf arba metodą PtrToStructure. Pvz.:

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

IronPython scenarijus

Sukurti naują tipo egzempliorių tipą, ir tada naudokite naują metodą perkrovos. Pvz.:

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

Būsena

„Microsoft“ patvirtino, kad tai yra „Microsoft“ produktų, išvardytų skyriuje „Taikoma“, problema.

Nuorodos

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.