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".