Přihlásit se pomocí účtu Microsoft
Přihlaste se nebo si vytvořte účet.
Dobrý den,
Vyberte jiný účet.
Máte více účtů.
Zvolte účet, pomocí kterého se chcete přihlásit.

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.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?
Po stisknutí tlačítka pro odeslání se vaše zpětná vazba použije k vylepšování produktů a služeb Microsoftu. Váš správce IT bude moci tato data shromažďovat. Prohlášení o zásadách ochrany osobních údajů.

Děkujeme vám za zpětnou vazbu.

×