Pse një ndihmës i vjetër proxy WinINet prishet në një ndërtim 64-bit
Njihni shkurtimin e treguesve në shembujt e interop të proxit në C# dhe rishikoni shtrirjen e strukturave dhe pronësinë e memories përpara se t'i ripërdorni.
Një cast i vetëm mund ta kthejë një ndihmës në dukje të zakonshëm të cilësimeve të proxit në një dështim që varet nga arkitektura:
current = (IntPtr)((int)current + optionSize);
Ai kod e ngushton një adresë amtare në një numër të plotë 32-bit përpara se të shtojë madhësinë e strukturës tjetër. Një proces 64-bit mund të mbajë adresa që nuk përshtaten. Në varësi të konvertimit dhe vlerës, rezultati mund të jetë një përjashtim tejmbushjeje ose një adresë e pavlefshme. Kthimi i ndërtimit në x86 mund ta fshehë gabimin, por e lë zbatimin e interop-it të varur nga ajo zgjidhje.
Mbajini adresat në formën e madhësisë së treguesit. Për shembull, për të ecur nëpër një varg tashmë të alokuar mund të përdoret:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Zhvendosja mbetet numër i plotë; vetë adresa nuk shtrydhet përmes një të tilli. Madhësia e alokimit dhe indeksi duhet të jenë ende të vlefshëm.
Pastaj shqyrtoni deklarimet përreth
Opsionet e WinINet për çdo lidhje përmbajnë një bashkim, anëtarët e të cilit përfshijnë një DWORD, një tregues vargu dhe një FILETIME. Fushat e treguesve kërkojnë IntPtr; fushat DWORD mbeten 32-bit. Rreshtimi amtar ka rëndësi, prandaj zëvendësimi i çdo numri të plotë me një numër të plotë 64-bit ose imponimi i një shtrirjeje të paketuar nuk është një rregullim i shëndoshë.
Përdorni madhësinë e strukturës pas marshaling kur ecni nëpër varg, përputhni vazhdimisht deklarimin ANSI ose Unicode dhe ndiqni çdo alokim veçmas. Lirimi i bllokut të strukturave të opsioneve nuk i liron automatikisht vargjet e alokuara diku tjetër dhe të referuara nga ato struktura.
Më në fund, mbani çështjen e shtrirjes së cilësimeve të ndarë nga korrektësia e memories. Rregullimi i një cast nuk provon që opsioni i zgjedhur i WinINet prek vetëm një kontroll, një proces ose cilësimet e përdoruesit aktual. Kontrolloni atë sjellje të API-së përpara se të miratoni pjesën tjetër të një shembulli të vjetër. Nëse dërgon gjithashtu njoftime rifreskimi, zgjidhni ato për shtrirjen e synuar.