Se aplică la
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

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.