Pazīmes
Kods, kas vērsti Microsoft .NET Framework 4.5.1 vai Microsoft .NET Framework 4.5.2 un kodu dinamiski saistās metodes (piemēram, izmantojot skriptu Windows PowerShell, IronPython, IronRuby vai cita dinamiskā valoda) izsauc metodi System.Runtime.InteropServices.Marshal.SizeOf vai System.Runtime.InteropServices.Marshal.PtrToStructure metodi, var rasties šādas problēmas.
Piezīme. Kodu, kas jau apkopoti uz pārvaldīto izpildāmais fails nedrīkst būt šīs problēmas, ja šo kodu izmanto dinamisko atslēgvārdu c#.1. problēma
Zvanu System.Runtime.InteropServices.Marshal.SizeOf mest MethodInvocationException šādu izņēmumu:
' <Tipa nosaukums>' nevar pārvieto nepārvaldīts struktūras; nobīde jebkādiem nozīmīgs lielums var būt aprēķināts.
2. problēma
Zvanu System.Runtime.InteropServices.Marshal.PtrToStructure mest MethodInvocationException šādu izņēmumu:
Norādīto struktūru jābūt blittable vai izkārtojuma informāciju.
3. problēma
Zvanu System.Runtime.InteropServices.Marshal.PtrToStructure mest RuntimeBinderException šādu izņēmumu:
Nevar tieši konvertēt tipu "anulēts" "objekts".
Cēlonis
Šī problēma rodas, jo skriptošanas programmas un dinamiskā valodās var piesaistīt jaunu pārslodzes, kas ir ieviests .NET Framework. Īpaši, ziņo, ka iepriekš izmantota Marshal.SizeOf(Type) tagad varat zvanīt Marshal.SizeOf < T > (T)un tagad varat zvanīt zvani, kas izmanto Marshal.PtrToStructure (IntPtr, tips) Marshal.PtrToStructure < T >(IntPtr, T). Šīs izmaiņas rada metodes vai izpildlaika binder mest izņēmumu.
Risinājums
Lai novērstu šo problēmu, mainiet kodu tā, ka tiek izmantota pareizā pārslodzes ja valodu ļauj to izdarīt. Norādot konkrētu metodi pārslodzes, nevar mainīt kodu, lai tā izmanto jauno metodi pārslodzes pareizi vietā.
Lai c# dinamisko izņēmumus
Pievienojiet vairākumu System.Type SizeOf metode vai metodes PtrToStructurezvana laikā. Piemērs:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Piezīme. Tas ir nepieciešams tikai viena metode argumentus darbojas dinamiskā.
Windows PowerShell skripti
Pievienojiet vairākumu System.Type SizeOf metode vai metodes PtrToStructurezvana laikā. Piemērs:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
IronPython skripti
Izveidojiet ierakstiet jaunā tipa un pēc tam izmantojiet jauno metodi pārslodzes. Piemērs:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance) obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Statuss
Korporācija Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir minēti sadaļā "Attiecas uz".