Vzťahuje sa na
Windows 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

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.

Odkazy

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.