Per què un antic auxiliar de proxy WinINet falla en una compilació de 64 bits
Reconeixeu el truncament de punters en exemples d'interop de proxy en C# i reviseu la disposició de les estructures i la propietat de la memòria abans de reutilitzar-los.
Una sola conversió pot convertir un auxiliar de configuració de proxy aparentment corrent en una fallada dependent de l'arquitectura:
current = (IntPtr)((int)current + optionSize);
Aquest codi estreta una adreça nativa a un enter de 32 bits abans d'afegir la mida de l'estructura següent. Un procés de 64 bits pot contenir adreces que no hi caben. Segons la conversió i el valor, el resultat pot ser una excepció de desbordament o una adreça no vàlida. Tornar la compilació a x86 pot amagar l'error, però deixa la implementació d'interop depenent d'aquest pedaç.
Manteniu les adreces en forma de mida de punter. Per exemple, per avançar per una matriu ja assignada es pot fer servir:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
El desplaçament continua sent un enter; l'adreça mateixa no es comprimeix a través d'un. La mida de l'assignació i l'índex encara han de ser vàlids.
Després reviseu les declaracions del voltant
Les opcions per connexió de WinINet contenen una unió els membres de la qual inclouen un DWORD, un punter a cadena i un FILETIME. Els camps punter necessiten IntPtr; els camps DWORD continuen sent de 32 bits. L'alineació nativa importa, així que substituir cada enter per un enter de 64 bits o forçar una disposició empaquetada no és una reparació sòlida.
Feu servir la mida de l'estructura després del marshaling en recórrer la matriu, feu coincidir la declaració ANSI o Unicode de manera coherent i seguiu cada assignació per separat. Alliberar el bloc d'estructures d'opcions no allibera automàticament les cadenes assignades en un altre lloc i referenciades per aquestes estructures.
Finalment, manteniu la qüestió de l'abast de la configuració separada de la correcció de la memòria. Reparar una conversió no demostra que l'opció WinINet triada per un auxiliar afecti només un control, un procés o la configuració de l'usuari actual. Comproveu aquest comportament de l'API abans d'adoptar la resta d'una mostra antiga. Si també envia notificacions d'actualització, seleccioneu-les per a l'abast previst.