Príznaky
Keď kód, ktorý sa zameriava na Microsoft .NET Framework 4.5.1 alebo Microsoft .NET Framework 4.5.2 a kód dynamicky sa viaže na metódy (napríklad pomocou skriptu prostredia Windows PowerShell, IronPython, IronRuby alebo iný dynamický jazyk) vyžaduje vyžadujeSystem.Runtime.InteropServices.Marshal.sizeof metóda alebo System.Runtime.InteropServices.Marshal.PtrToStructure metóda, môžu sa vyskytnúť nasledujúce problémy.
Poznámka: Kód, ktorý je už zostavené do spustiteľného spravované nevykazuje tieto problémy, ak kód používa dynamické kľúčové slovo v jazyku C#.
Problém 1
Hovory vyžadujeSystem.Runtime.InteropServices.Marshal.sizeof hodiť tieto MethodInvocationException :
Typ "<názov typu>" nemôžu byť zaradené ako nespravované; zmysel veľkosť ani pozícia môže byť vypočítaná.
Problém 2
Žiada, aby System.Runtime.InteropServices.Marshal.PtrToStructure hodiť tieto MethodInvocationException :
Uvedené štruktúry musia byť blittable alebo rozloženie informácie.
Problém 3
Žiada, aby System.Runtime.InteropServices.Marshal.PtrToStructure hodiť RuntimeBinderException nasledujúce výnimky:
Nemožno implicitne konvertovať typu "neplatné" k "objekt".
Príčina
Tento problém sa vyskytuje, pretože skriptovanie mechanizmy a dynamických jazykov môže viazať na nové preťaženia, ktorý je predstavený v .NET Framework. Konkrétne, hovory, ktoré predtým používané Marshal.SizeOf(Type) teraz volať Marshal.SizeOf < T > (T)a hovory, ktoré používajú Marshal.PtrToStructure (IntPtr, typ) teraz volať Marshal.PtrToStructure < T >(IntPtr, T). Táto zmena spôsobí metódy alebo runtime rýchloviazača hodiť výnimku.
Alternatívne riešenie
Ak chcete vyriešiť tento problém, zmeniť kód používa správne preťaženia Ak jazyk, ktorý umožňuje vykonať. Ak nemôžete určiť špecifická metóda preťaženia, Zmeňte kód tak, že využíva nová metóda preťaženia správne miesto.
Pre C# dynamické vyvolania
Pridať obsadenie System.Type v rámci volanie SizeOf metóda alebo PtrToStructure. Napríklad:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Poznámka: Je to len potrebné jeden z argumentov postup pri dynamických.
Pre skriptov prostredia Windows PowerShell
Pridať obsadenie System.Type v rámci volanie SizeOf metóda alebo PtrToStructure. Napríklad:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Skripty IronPython
Vytvoriť nový typ inštanciu typu a potom použite nový spôsob preťaženia. Napríklad:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Stav
Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.