Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

Симптомы

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

Статус

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

Ссылки

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

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

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

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

Спасибо за ваш отзыв!

×