Sümptomid
Kui koodi, mis on suunatud Microsoft .NET Frameworki 4.5.1 või Microsoft .NET Frameworki 4.5.2 ja kood dünaamiliselt seondub meetodeid (näiteks kasutades skripti Windows PowerShelli, IronPython, IronRuby või dünaamiliste keelte) nõuab kutsubSystem.Runtime.InteropServices.Marshal.SizeOf meetodit või meetodit System.Runtime.InteropServices.Marshal.PtrToStructure , võivad ilmneda järgmised probleemid.
Märkus. Koodi, mis on juba koostanud hallatava käivitatava käituvad nende probleemide korral, kui see kood kasutab dünaamilise märksõna C#.
1. probleem
Kõned System.Runtime.InteropServices.Marshal.SizeOf viska MethodInvocationException järgmise erandiga:
' <Nimi>' ei saa pakkida haldamata struktuur; erinevust ega tähendusrikas suurus arvutatakse.
2. probleem
Kõned System.Runtime.InteropServices.Marshal.PtrToStructure viska MethodInvocationException järgmise erandiga:
Kindlaksmääratud struktuuri tuleb blittable või paigutuse teavet.
Küsimus 3
Kõned System.Runtime.InteropServices.Marshal.PtrToStructure viska RuntimeBinderException järgmise erandiga:
Tüüp 'tühised' "objektile" kaudselt ei saa teisendada.
Põhjus
Selle probleemi põhjuseks skriptimine mootorid ja dünaamiline tekst võib siduda .NET Frameworki kasutusele uue ülekoormus. Täpsemalt nõuab, et varem kasutatud Marshal.SizeOf(Type) võib nüüd kõne Marshal.SizeOf < T > (T)ja kõned, mida kasutatakse Marshal.PtrToStructure (IntPtr, tüüp) võib nüüd kõne Marshal.PtrToStructure < T >(IntPtr, T). See muudatus põhjustab runtime sideaine ilmnenud erand või meetodeid.
Lahendus
Selle probleemi lahendamiseks muutke kood, et ta kasutab õige ülekoormus, kui teie keel võimaldab teil seda teha. Kui te ei saa määrata konkreetset meetodit ülekoormus, muuta koodi, et ta kasutab uus meetod ülekoormuse õigesti hoopis.
C# dünaamiline kutsumise jaoks
Lisage ka osades System.Type maksimaalselt kõne suuruseks või meetodi PtrToStructure. Näiteks:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Märkus. See on vajalik ainult siis, kui üks meetod argumendid on dünaamiline.
Windows PowerShelli skriptide jaoks
Lisage ka osades System.Type maksimaalselt kõne suuruseks või meetodi PtrToStructure. Näiteks:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
IronPython skripte
Tippige uue eksemplari tüüp luua, ja seejärel kasutage uus meetod ülekoormuse. Näiteks:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Olek
Microsoft on kinnitanud, et see probleem esineb jaotises "Kehtib järgmiste toodete kohta" loetletud Microsofti toodetel.