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".