Satu cast boleh menjadikan pembantu tetapan proksi yang kelihatan biasa sebagai kegagalan bergantung pada seni bina:

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

Kod itu menyempitkan alamat asli kepada integer 32-bit sebelum menambah saiz struktur seterusnya. Proses 64-bit boleh memegang alamat yang tidak muat. Bergantung pada penukaran dan nilai, hasilnya boleh menjadi pengecualian limpahan atau alamat tidak sah. Menukar binaan kembali kepada x86 boleh menyembunyikan kesilapan, tetapi membiarkan pelaksanaan interop bergantung pada penyelesaian itu.

Kekalkan alamat dalam bentuk saiz penuding. Contohnya, untuk bergerak melalui tatasusunan yang telah diperuntukkan boleh menggunakan:

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

Ofset kekal sebagai integer; alamat itu sendiri tidak diperah melaluinya. Saiz peruntukan dan indeks masih perlu sah.

Kemudian periksa pengisytiharan di sekeliling

Pilihan WinINet bagi setiap sambungan mengandungi union yang ahlinya termasuk DWORD, penuding rentetan dan FILETIME. Medan penuding memerlukan IntPtr; medan DWORD kekal 32-bit. Penjajaran asli penting, jadi menggantikan setiap integer dengan integer 64-bit atau memaksa susun atur berbungkus bukan pembaikan yang kukuh.

Gunakan saiz struktur selepas marshaling semasa merentasi tatasusunan, padankan pengisytiharan ANSI atau Unicode secara konsisten, dan jejaki setiap peruntukan secara berasingan. Membebaskan blok struktur pilihan tidak melepaskan rentetan yang diperuntukkan di tempat lain dan dirujuk oleh struktur itu secara automatik.

Akhir sekali, asingkan persoalan skop tetapan daripada ketepatan memori. Membaiki cast tidak membuktikan bahawa pilihan WinINet yang dipilih pembantu hanya mempengaruhi satu kawalan, satu proses atau tetapan pengguna semasa. Semak tingkah laku API itu sebelum menerima baki contoh lama. Jika ia juga menghantar pemberitahuan muat semula, pilihnya untuk skop yang dimaksudkan.

Artikel berkaitan