Применяется к
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

Симптомы

Когда код, предназначенный для платформа.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)

Статус

Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе "Относится к".

Ссылки

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.