Platí pro
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

Příznaky

Pokud kód, který se zaměřuje rozhraní.NET Framework Microsoft 4.5.1 nebo rozhraní.NET Framework Microsoft 4.5.2 a kód dynamicky váže na metody (například pomocí skriptu v prostředí Windows PowerShell, IronPython, IronRuby nebo jiný dynamický jazyk) volá metodu System.Runtime.InteropServices.Marshal.SizeOf nebo System.Runtime.InteropServices.Marshal.PtrToStructure , může docházet k následujícím problémům.Poznámka: Kód, který je již zkompilován do spravované spustitelné nevykazuje tyto problémy, pokud tento kód používá dynamické klíčové slovo v jazyce C#.

Problém 1

Volání System.Runtime.InteropServices.Marshal.SizeOf vyvolat výjimku následující MethodInvocationException :

Typ ' <název typu>' nelze zařazeno jako nespravované konstrukce; být vypočteny žádné smysluplné size a offset.

Problém 2

Volání System.Runtime.InteropServices.Marshal.PtrToStructure vyvolat výjimku následující MethodInvocationException :

Uvedená struktura musí být přímo přenositelná nebo obsahovat informace o rozložení.

Problém 3

Volání System.Runtime.InteropServices.Marshal.PtrToStructure vyvolat RuntimeBinderException následující výjimce:

Nelze implicitně převést typ 'void' 'objekt'.

Příčina

K tomuto problému dochází, protože skriptovací stroje a dynamických jazyků může navázat nové přetížení, která je zavedena v rozhraní.NET Framework. Konkrétně volání, které se dříve používal Marshal.SizeOf(Type) nyní mohou volat Marshal.SizeOf < T > (T)a volání, které používají Marshal.PtrToStructure (IntPtr, typ) nyní mohou volat Marshal.PtrToStructure < T >(IntPtr, T). Tato změna způsobí, že metody nebo pořadač runtime vyvolá výjimku.

Jak potíže obejít

Chcete-li tento problém vyřešit, změňte kód tak, aby používala správné přetížení, pokud váš jazyk umožňuje provést. Pokud nelze zadat konkrétní metoda přetížení, změňte kód tak, aby používala nové přetížení metody správné místo.

Pro C# dynamické vyvolání

Přidáte přetypování System.Type v rámci volání metody SizeOf nebo PtrToStructuremetody. Například:

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

Poznámka: To je pouze nezbytné, pokud je jeden z argumentů metody dynamické.

Skripty prostředí Windows PowerShell

Přidáte přetypování System.Type v rámci volání metody SizeOf nebo PtrToStructuremetody. Například:

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

IronPython skriptů

Vytvoření nové instance typu typu a potom použít nové přetížení metody. Například:

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

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Odkazy

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.