Por que um antigo auxiliar de proxy WinINet quebra numa compilação de 64 bits
Reconheça o truncamento de ponteiros em exemplos de interop de proxy em C# e revise o layout das estruturas e a propriedade da memória antes de reutilizá-los.
Uma única conversão pode transformar um auxiliar de configurações de proxy aparentemente comum numa falha dependente da arquitetura:
current = (IntPtr)((int)current + optionSize);
Esse código estreita um endereço nativo para um inteiro de 32 bits antes de somar o tamanho da próxima estrutura. Um processo de 64 bits pode conter endereços que não cabem. Dependendo da conversão e do valor, o resultado pode ser uma exceção de estouro ou um endereço inválido. Voltar a compilar para x86 pode esconder o erro, mas deixa a implementação de interop dependente dessa gambiarra.
Mantenha os endereços na forma do tamanho de um ponteiro. Por exemplo, para avançar por uma matriz já alocada pode-se usar:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
O deslocamento continua inteiro; o próprio endereço não é espremido por ele. O tamanho da alocação e o índice ainda precisam ser válidos.
Depois inspecione as declarações ao redor
As opções por conexão do WinINet contêm uma união cujos membros incluem um DWORD, um ponteiro de string e um FILETIME. Campos de ponteiro precisam de IntPtr; campos DWORD continuam com 32 bits. O alinhamento nativo importa, então substituir cada inteiro por um inteiro de 64 bits ou forçar um layout empacotado não é um reparo sólido.
Use o tamanho da estrutura após o marshaling ao percorrer a matriz, combine a declaração ANSI ou Unicode de forma consistente e acompanhe cada alocação separadamente. Liberar o bloco de estruturas de opções não libera automaticamente as strings alocadas noutro lugar e referenciadas por essas estruturas.
Por fim, mantenha a questão do escopo das configurações separada da correção da memória. Consertar uma conversão não prova que a opção WinINet escolhida por um auxiliar afeta apenas um controle, um processo ou as configurações do usuário atual. Verifique esse comportamento da API antes de adotar o resto de um exemplo antigo. Se ele também enviar notificações de atualização, selecione-as para o escopo pretendido.