Een eenzegen Cast kann aus engem schäinbar gewéinlechen Proxy-Astellungshelfer eng Architektur-ofhängeg Fehlfunktioun maachen:

current = (IntPtr)((int)current + optionSize);

Deen Code engt eng natives Adress op eng 32-Bit-Ganzzuel an, ier d'Gréisst vun der nächster Struktur derbäigesat gëtt. E 64-Bit-Prozess kann Adressen halen, déi net dra passen. Ofhängeg vun der Konversioun an dem Wäert kann d'Resultat eng Iwwerlaf-Ausnahm oder eng ongülteg Adress sinn. De Build zréck op x86 ze setzen kann de Feeler verstoppen, awer léisst d'Interop-Implementatioun vun deem Workaround ofhänken.

Halt d'Adressen a Punktetgréisst. Zum Beispill kann een duerch en déjà zougewisenen Array esou virugoen:

IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));

Den Offset bleift eng Ganzzuel; d'Adress selwer gëtt net duerch eng gedréckt. D'Gréisst vun der Zouwaisung an den Index musse weider gülteg sinn.

Dann iwwerpréif d'Deklaratiounen ronderëm

D'WinINet-Optiounen pro Verbindung enthalen eng Unioun, deenen hir Memberen en DWORD, e Stringpunktéier an eng FILETIME enthalen. Punktetfelder brauchen IntPtr; DWORD-Felder bleiwen 32-Bit. Nativ Ausriichtung ass wichteg, dofir ass et keng gutt Reparatur, all Ganzzuel duerch eng 64-Bit-Ganzzuel z'ersetzen oder eng gepackte Layout ze forcéieren.

Benotz d'Strukturgréisst nom Marshaling, wann s du duerch den Array gees, gläich d'ANSI- oder Unicode-Deklaratioun konsequent of, a verfolleg all Zouwaisung eenzel. D'Fräisetze vum Block mat Optiounsstrukturen entléist net automatesch Strings, déi soss ewou zougewisen a vun deene Strukturen referenzéiert ginn.

Zum Schluss, halt d'Fro vum Astellungsberäich getrennt vun der Speicherkorrektheet. Eng Cast ze reparéiere beweise net, datt eng gewielten WinINet-Optioun nëmmen ee Steierement, een Prozess oder d'Astellunge vum aktuelle Benotzer beaflosst. Préif dat API-Verhalen, ier s de Rescht vun engem ale Beispill iwwerhëls. Wann et och Erfrëschungsnotifikatiounen schéckt, wielt se fir de virgesinnene Beräich.

Ähnlech Artikelen