Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Симптоми

Когато код, насочена към 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, изброени в раздела "Отнася се за".

Препратки

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×