Kvifor ein gamal WinINet-proxyhjelpar knekk i eit 64-bit bygg
Kjenna att peikartrunkering i C#-proxy-interop-døme, og gå gjennom strukturoppsett og minneeigarskap før du brukar dei om att.
Éin cast kan gjere ein tilsynelatande vanleg hjelpar for proxyinnstillingar om til ein arkitekturavhengig feil:
current = (IntPtr)((int)current + optionSize);
Den koden snevrar ein opphavleg adresse inn til eit 32-bit heiltal før storleiken på neste struktur blir lagd til. Ein 64-bit prosess kan halde adresser som ikkje passar. Avhengig av konverteringa og verdien kan resultatet vere eit overflytsunntak eller ei ugyldig adresse. Å byggje for x86 att kan skjule feilen, men gjer interop-implementasjonen avhengig av den omvegen.
Hald adresser i peikarstorleik. Til dømes kan gjennomgang av ein allereie allokert matrise bruke:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Forskyvinga blir verande eit heiltal; sjølve adressa blir ikkje pressa gjennom eit. Allokeringsstorleiken og indeksen må framleis vere gyldige.
Undersøk deretter deklarasjonane rundt
WinINet-innstillingane per tilknyting inneheld ein union der medlemmene omfattar ein DWORD, ein strengpeikar og ein FILETIME. Peikarfelt treng IntPtr; DWORD-felt blir verande 32-bit. Innebygd justering har noko å seie, så å byta ut kvart heiltal med eit 64-bit heiltal eller tvinge eit pakka oppsett er ikkje ein solid reparasjon.
Bruk den marshalla strukturstorleiken når du går gjennom matrisa, match ANSI- eller Unicode-deklarasjonen konsekvent, og spor kvar allokering separat. Frigjering av blokka med innstillingsstrukturar frigjer ikkje automatisk strengar som er allokerte andre stader og refererte av desse strukturane.
Til slutt, hald spørsmålet om omfanget til innstillingane skilt frå minnekorrektheit. Reparasjon av ein cast provar ikkje at ein hjelpar sin valde WinINet-innstilling berre påverkar éin kontroll, éin prosess eller innstillingane til den gjeldande brukaren. Kontroller den API-åtferda før du tek i bruk resten av eit gamalt døme. Viss det òg sender oppdateringsvarsel, vel dei for det tiltenkte omfanget.