Симптомы
Когда код, предназначенный для платформа.NET Framework Microsoft 4.5.1 или платформа.NET Framework Microsoft 4.5.2 и код динамически привязывается к методы (например, с помощью сценариев в Windows PowerShell, IronPython, IronRuby или другого динамического языка) вызывает метод System.Runtime.InteropServices.Marshal.SizeOf или System.Runtime.InteropServices.Marshal.PtrToStructure , могут возникнуть следующие проблемы.
Примечание. Код, который компилируется в управляемом исполняемом файле уже не соответствуют эти проблемы, если этот код не использует ключевое слово dynamic в C#.
Проблема 1
Вызовы System.Runtime.InteropServices.Marshal.SizeOf исключение следующих MethodInvocationException :
Тип ' <имя>' невозможно маршалировать как неуправляемую структуру; Невозможно вычислить не смысл размер или смещение.
Проблема 2
Вызовы System.Runtime.InteropServices.Marshal.PtrToStructure исключение следующих MethodInvocationException :
Указанная структура должны быть непреобразуемыми или иметь сведения о макете.
Проблема 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). Это изменение вызывает методы или связыватель времени выполнения для создания исключения.
Временное решение
Чтобы обойти эту проблему, измените код таким образом, чтобы он использует правильный перегрузки, если язык позволяет сделать это. Если нельзя задать конкретный метод перегрузки, измените код, чтобы новая перегрузка метода правильно вместо этого он использует.
Для динамического вызова C#
Добавьте в вызов метода SizeOf или метода PtrToStructureприведение System.Type . Например:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Примечание. Это требуется только если один из аргументов метода является динамическим.
Для сценариев Windows PowerShell.
Добавьте в вызов метода SizeOf или метода PtrToStructureприведение System.Type . Например:
$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)
Статус
Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе "Относится к".