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.