የቀድሞ WinINet ፕሮክሲ አጋዥ በ64-ቢት ግንባታ ለምን ይሰበራል
በC# ፕሮክሲ interop ምሳሌዎች ውስጥ የጠቋሚ መቆራረጥን ይለዩ እና እንደገና ከመጠቀማቸው በፊት የአወቃቀር አቀማመጥንና የማስታወሻ ባለቤትነትን ይገምግሙ።
አንድ ካስት በጨረፍታ ተራ የሚመስል የፕሮክሲ ቅንብሮች አጋዥን በአርክቴክቸር ላይ የተመሠረተ ውድቀት ሊያደርገው ይችላል፦
current = (IntPtr)((int)current + optionSize);
ያ ኮድ የቀጣዩን አወቃቀር መጠን ከመጨመሩ በፊት የአገር ቤት አድራሻን ወደ 32-ቢት ኢንቲጀር ያጠባል። የ64-ቢት ሂደት የማይገቡ አድራሻዎችን ሊይዝ ይችላል። እንደ ልወጣውና እሴቱ ውጤቱ የመጠን መብለጥ ስህተት ወይም ልክ ያልሆነ አድራሻ ሊሆን ይችላል። ግንባታውን ወደ x86 መመለስ ስህተቱን ሊደብቅ ይችላል፣ ነገር ግን interop አፈጻጸሙን በዚያ የጊዜያዊ መፍትሄ ላይ ጥገኛ ያደርገዋል።
አድራሻዎችን በጠቋሚ መጠን ቅርጽ ያቆዩ። ለምሳሌ፣ አስቀድሞ በተመደበ ድርድር ውስጥ መራመድ ይህን ሊጠቀም ይችላል፦
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
offset ኢንቲጀር ሆኖ ይቆያል፤ አድራሻው ራሱ በኢንቲጀር አይጨመቅም። የመመደቢያው መጠንና መረጃ ጠቋሚው አሁንም ልክ መሆን አለባቸው።
ከዚያ በዙሪያው ያሉትን መግለጫዎች ይመርምሩ
የWinINet በየግንኙነቱ ያሉ አማራጮች DWORD፣ የሕብረቁምፊ ጠቋሚና FILETIME የሚያካትት union ይይዛሉ። የጠቋሚ መስኮች IntPtr ይፈልጋሉ፤ የDWORD መስኮች 32-ቢት ሆነው ይቆያሉ። የአገር ቤት አሰላለፍ ይጠቅማል፣ ስለዚህ ሁሉንም ኢንቲጀር በ64-ቢት ኢንቲጀር መተካት ወይም የታመቀ አቀማመጥ ማስገደድ ጤናማ ጥገና አይደለም።
ድርድሩን ሲያስተላልፉ የተላለፈውን የአወቃቀር መጠን ይጠቀሙ፣ የANSI ወይም የUnicode መግለጫን ወጥ በሆነ መንገድ ያዛምዱ፣ እና እያንዳንዱን መመደብ ለየብቻ ይከታተሉ። የአማራጭ አወቃቀሮችን ብሎክ ማላቀቅ በሌላ ቦታ የተመደቡና በእነዚያ አወቃቀሮች የሚጠቅሱ ሕብረቁምፊዎችን በራስ-ሰር አያለቅም።
በመጨረሻ፣ የቅንብር ወሰን ጥያቄን ከማስታወሻ ትክክለኛነት ለየብቻ ያድርጉ። ካስት መጠገን የአንድ አጋዥ የመረጠው WinINet አማራጭ አንድ መቆጣጠሪያ፣ አንድ ሂደት ወይም የአሁኑ ተጠቃሚ ቅንብሮች ላይ ብቻ ተጽዕኖ እንደሚያሳድር አያረጋግጥም። የቀረውን የቀድሞ ምሳሌ ከመቀበልዎ በፊት ያንን የAPI ባህሪ ያረጋግጡ። እንዲሁም የማደሻ ማሳወቂያዎችን ከላከ፣ ለታሰበው ወሰን ይምሯቸው።