Por que un antigo axudante de proxy WinINet falla nunha compilación de 64 bits
Recoñeza o truncamento de punteiros en exemplos de interoperabilidade de proxy en C# e revise a disposición das estruturas e a propiedade da memoria antes de reutilizalos.
Unha soa conversión pode converter un axudante de configuración de proxy aparentemente normal nun fallo dependente da arquitectura:
current = (IntPtr)((int)current + optionSize);
Ese código reduce un enderezo nativo a un enteiro de 32 bits antes de sumar o tamaño da estrutura seguinte. Un proceso de 64 bits pode conter enderezos que non caben. Segundo a conversión e o valor, o resultado pode ser unha excepción de desbordamento ou un enderezo non válido. Volver compilar para x86 pode ocultar o erro, pero deixa a implementación de interoperabilidade dependente dese parche.
Manteña os enderezos en forma de tamaño de punteiro. Por exemplo, para avanzar por unha matriz xa asignada pódese usar:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
O desprazamento segue sendo un enteiro; o propio enderezo non se comprime a través dun. O tamaño da asignación e o índice aínda deben ser válidos.
Despois inspeccione as declaracións da contorna
As opcións por conexión de WinINet conteñen unha unión cuxos membros inclúen un DWORD, un punteiro a cadea e un FILETIME. Os campos de punteiro necesitan IntPtr; os campos DWORD seguen sendo de 32 bits. A aliñación nativa importa, así que substituír cada enteiro por un enteiro de 64 bits ou forzar un deseño empaquetado non é unha reparación sólida.
Use o tamaño da estrutura tras o marshaling ao percorrer a matriz, faga coincidir a declaración ANSI ou Unicode de forma coherente e rastree cada asignación por separado. Liberar o bloque de estruturas de opcións non libera automaticamente as cadeas asignadas noutro lugar e referenciadas por esas estruturas.
Por último, manteña a cuestión do alcance da configuración separada da corrección da memoria. Reparar unha conversión non demostra que a opción de WinINet escollida por un axudante afecte só a un control, un proceso ou a configuración do usuario actual. Comprobe ese comportamento da API antes de adoptar o resto dunha mostra antiga. Se ademais envía notificacións de actualización, seleccióneas para o alcance previsto.