Applies ToWindows 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

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

Atsauces

Nepieciešama papildu palīdzība?

Vēlaties vairāk opciju?

Izpētiet abonementa priekšrocības, pārlūkojiet apmācības kursus, uzziniet, kā aizsargāt ierīci un veikt citas darbības.

Kopienas palīdz uzdot jautājumus un atbildēt uz tiem, sniegt atsauksmes, kā arī saņemt informāciju no ekspertiem ar bagātīgām zināšanām.