Tek bir cast, görünüşte sıradan bir proxy ayarları yardımcısını mimariye bağlı bir hataya dönüştürebilir:

current = (IntPtr)((int)current + optionSize);

Bu kod, bir sonraki yapının boyutunu eklemeden önce yerel bir adresi 32 bit tam sayıya daraltır. 64 bit bir süreç sığmayan adresleri tutabilir. Dönüşüme ve değere bağlı olarak sonuç bir taşma istisnası veya geçersiz adres olabilir. Derlemeyi x86'ya geri almak hatayı gizleyebilir, ancak interop uygulamasını bu geçici çözüme bağımlı bırakır.

Adresleri işaretçi boyutunda tutun. Örneğin, önceden ayrılmış bir dizi içinde ilerlemek için şu kullanılabilir:

IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));

Ofset tam sayı olarak kalır; adresin kendisi bunun içinden sıkıştırılmaz. Ayırma boyutu ve dizin hâlâ geçerli olmalıdır.

Ardından çevredeki bildirimleri inceleyin

WinINet'in bağlantı başına seçenekleri, üyeleri arasında DWORD, dize işaretçisi ve FILETIME bulunan bir birleşim içerir. İşaretçi alanları IntPtr gerektirir; DWORD alanları 32 bit kalır. Yerel hizalama önemlidir, bu nedenle her tam sayıyı 64 bit tam sayıyla değiştirmek veya paketlenmiş bir düzen dayatmak sağlam bir onarım değildir.

Dizide ilerlerken marshaling sonrası yapı boyutunu kullanın, ANSI veya Unicode bildirimini tutarlı biçimde eşleştirin ve her ayırmayı ayrı ayrı izleyin. Seçenek yapılarının bloğunu serbest bırakmak, başka yerde ayrılan ve bu yapıların başvurduğu dizeleri otomatik olarak serbest bırakmaz.

Son olarak, ayarların kapsamı sorununu bellek doğruluğundan ayrı tutun. Bir cast'ı onarmak, yardımcının seçtiği WinINet seçeneğinin yalnızca bir denetimi, bir süreci veya geçerli kullanıcının ayarlarını etkilediğini kanıtlamaz. Eski bir örneğin geri kalanını benimsemeden önce bu API davranışını doğrulayın. Yenileme bildirimleri de gönderiyorsa, bunları amaçlanan kapsam için seçin.

İlgili makaleler