Хуучин WinINet прокси туслах 64-бит бүтээцэд яагаад эвдэрдэг вэ
C# прокси interop жишээн дэх заагчийн тайрлыг таньж, дахин ашиглахаас өмнө бүтцийн зохион байгуулалт болон санах ойн эзэмшлийг шалгана уу.
Нэг cast нь энгийн мэт санагдах прокси тохиргооны туслахыг архитектураас хамааралтай алдаа болгож болно:
current = (IntPtr)((int)current + optionSize);
Тэр код дараагийн бүтцийн хэмжээг нэмэхийн өмнө төрөлх хаягийг 32-бит бүхэл тоо болгон нарийсгадаг. 64-бит процесс багтахгүй хаяг хадгалж чадна. Хөрвүүлэлт болон утгаас хамаарч үр дүн нь халилтын үл хамаарах зүйл эсвэл хүчингүй хаяг байж болно. Бүтээцийг x86 руу буцаах нь алдааг нууж болох ч interop хэрэгжүүлэлтийг тэр тойрч гарах аргаас хамааралтай болгодог.
Хаягуудыг заагчийн хэмжээтэй хэлбэрээр бариарай. Жишээлбэл, аль хэдийн хуваарилагдсан массиваар урагшлахдаа дараахыг ашиглаж болно:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Оффсет бүхэл тоо хэвээр байна; хаяг өөрөө түүгээр шахагддаггүй. Хуваарилалтын хэмжээ болон индекс хүчинтэй байх ёстой.
Дараа нь эргэн тойрны зарлалуудыг шалгана уу
WinINet-ийн холболт бүрийн сонголтууд нь DWORD, тэмдэгтийн заагч болон FILETIME агуулсан нэгдлийг агуулна. Заагч талбаруудад IntPtr шаардлагатай; DWORD талбарууд 32-бит хэвээр байна. Төрөлх зэрэгцүүлэлт чухал тул бүх бүхэл тоог 64-бит бүхэл тоогоор солих эсвэл багцлагдсан зохион байгуулалтыг шаардах нь зөв засвар биш юм.
Массиваар явахдаа marshaling-ийн дараах бүтцийн хэмжээг ашигла, ANSI эсвэл Unicode зарлалыг тууштай тааруулж, хуваарилалт бүрийг тусад нь хяна. Сонголтын бүтцүүдийн блокийг чөлөөлөх нь өөр газар хуваарилагдсан, тэдгээр бүтцээс лавлагдсан тэмдэгт мөрүүдийг автоматаар чөлөөлөхгүй.
Эцэст нь тохиргооны хамрах хүрээний асуудлыг санах ойн зөв байдлаас тусгаарлаарай. Cast засах нь туслахын сонгосон WinINet сонголт зөвхөн нэг удирдлага, нэг процесс эсвэл одоогийн хэрэглэгчийн тохиргоонд нөлөөлдөг гэдгийг батлахгүй. Хуучин жишээний үлдсэн хэсгийг авахаас өмнө тэр API зан төлөвийг шалгана уу. Хэрэв энэ нь мөн сэргээх мэдэгдэл илгээдэг бол тэдгээрийг зориулалтын хүрээнд сонгоно уу.