Conectați-vă cu Microsoft
Conectați-vă sau creați un cont
Salut,
Selectați un alt cont.
Aveți mai multe conturi
Alegeți contul cu care doriți să vă conectați.

Simptome

Când se leagă de cod care vizează Microsoft .NET Framework 4.5.1 sau Microsoft .NET Framework 4.5.2 și codul dinamic metode (de exemplu, utilizând un script Windows PowerShell, IronPython, IronRuby sau o altă limbă dinamice) apelează metoda System.Runtime.InteropServices.Marshal.SizeOf sau metoda System.Runtime.InteropServices.Marshal.PtrToStructure , este posibil să apară următoarele probleme.

Notă Cod care este deja compilate într-un fișier executabil gestionate nu manifestă aceste probleme, cu excepția cazului în care codul utilizează cuvântul cheie dinamică în C#.

Problema 1

Apelurile către System.Runtime.InteropServices.Marshal.SizeOf throw excepție MethodInvocationException următoarele:

Tastați ' <nume tip>' nu poate fi adunate ca o structură negestionate; poate fi calculat nu semnificativ dimensiunea sau offset.

Problema 2

Apelurile către System.Runtime.InteropServices.Marshal.PtrToStructure throw excepție MethodInvocationException următoarele:

Structura specificat trebuie blittable sau au aspect informații.


Problema 3

Apelurile către System.Runtime.InteropServices.Marshal.PtrToStructure throw excepție RuntimeBinderException următoarele:

Nu efectuați conversia implicit tip void 'obiect'.


Cauza

Această problemă apare deoarece motoarele de scriptare și limbi dinamică poate lega la o suprasarcină nou care este introdus în .NET Framework. Mai precis, apeluri utilizate anterior Marshal.SizeOf(Type) acum poate apela Marshal.SizeOf < T > (T)și apeluri care utilizează Marshal.PtrToStructure (IntPtr, tastați) poate apela acum Marshal.PtrToStructure < T >(IntPtr, T). Această modificare provoacă metodele sau binder de execuție a o excepție.

Soluție

Pentru a rezolva această problemă, modificați codul, astfel încât el utilizează suprasarcină corect dacă limba dvs. vă permite să faceți acest lucru. Dacă aveți posibilitatea să specificați o anumită metodă suprasarcină, modificați codul, astfel încât el utilizează noua metodă suprasarcină corect în schimb.

Pentru C# invocarea dinamică

Adăugați o exprimate System.Type în apelul către metoda SizeOf sau metoda PtrToStructure. De exemplu:

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);


Notă Acest lucru este necesar doar atunci când este unul dintre argumentele la metoda dinamică.

Pentru Scripturilor Windows PowerShell

Adăugați o exprimate System.Type în apelul către metoda SizeOf sau metoda PtrToStructure. De exemplu:

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

Pentru IronPython script-uri

Creați o nouă instanță de tip de tip și apoi utilizați noua metodă suprasarcină. De exemplu:

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

Stare

Microsoft a confirmat că aceasta este o problemă cu produsele Microsoft enumerate în secţiunea „Se aplică la".

Referințe

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.

Au fost utile aceste informații?

Cât de mulțumit sunteți de calitatea limbajului?
Ce v-a afectat experiența?
Apăsând pe Trimitere, feedbackul dvs. va fi utilizat pentru a îmbunătăți produsele și serviciile Microsoft. Administratorul dvs. IT va avea posibilitatea să colecteze aceste date. Angajamentul de respectare a confidențialității.

Vă mulțumim pentru feedback!

×