Симптоми
Когато код, насочена към Microsoft .NET Framework 4.5.1 или на Microsoft .NET Framework 4.5.2 и код динамично свързва методи (например използване на скрипт на Windows PowerShell, IronPython, IronRuby или друг динамичен език) изисква System.Runtime.InteropServices.Marshal.SizeOf или System.Runtime.InteropServices.Marshal.PtrToStructure метод, може да възникнат следните проблеми.
Забележка Код, който вече е съставен в управлявана изпълнимия проявява тези проблеми, освен ако този код използва динамична дума в C#.
Проблем 1
Повиквания към System.Runtime.InteropServices.Marshal.SizeOf хвърли следното MethodInvocationException изключение:
Въведете "<име на тип>" не могат да бъдат наблюдавани неуправляван структура; без значение размера или отместване може да се изчислява.
Проблем 2
Повиквания към System.Runtime.InteropServices.Marshal.PtrToStructure хвърли следното MethodInvocationException изключение:
Указаният структура трябва да бъде blittable или информация оформление.
Проблем 3
Повиквания към System.Runtime.InteropServices.Marshal.PtrToStructure хвърли следното RuntimeBinderException изключение:
Мълчаливо не конвертирате тип void "обект".
Причина
Този проблем възниква, защото скриптове машини и динамични езици могат да се свързват с нов претоварване, който е въведен в .NET Framework. По-специално, повиквания, които използват по-рано Marshal.SizeOf(Type) сега може да поиска Marshal.SizeOf < T > (T)и сега може да поиска повиквания, които използват Marshal.PtrToStructure (IntPtr, тип) Marshal.PtrToStructure < T >(IntPtr, T). Промяната води методи или binder runtime да хвърли изключение.
Заобикаляне на проблема
За да заобиколите този проблем, променете кода така че да използва правилните претоварване, ако вашият език ви позволява да направите това. Ако не можете да зададете конкретни метод претоварване, променя кода, така че да използва новия метод претоварване правилно вместо.
За C# динамично извикване
Добавете гласове System.Type в рамките на повикване до SizeOf или метод PtrToStructure. Например:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Забележка Това е необходимо само когато аргументи метод е динамичен.
За Windows PowerShell скриптове
Добавете гласове System.Type в рамките на повикване до SizeOf или метод PtrToStructure. Например:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
За IronPython скриптове
Създаване на нов тип екземпляр на тип и след това използвайте нов метод претоварване. Например:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Статус
Microsoft потвърждава, че това е проблем в продуктите на Microsoft, изброени в раздела "Отнася се за".