मुझे ऐसी स्थिति का सामना करना पड़ रहा है जहां CloseHandle
पर एक PInvoke कॉल डीबगर के तहत चलाए जाने पर .NET 4 अनुप्रयोग में SEHException
फेंक रहा है। others who have encountered similar issues migrating from 3.5 to 4 के विपरीत, मैं विशेष रूप से व्यवहार से परेशान नहीं हूं, और पहले ही समस्या को ढूंढ चुका हूं (एक थर्ड पार्टी लाइब्रेरी एक ही हैंडल पर CloseHandle
दो बार कॉल कर रही है)। हालांकि, मुझे परेशान है कि यह व्यवहार .NET 3.5 एप्लिकेशन में क्यों नहीं होता है।क्लोजहैंडल से अपवादों का संचालन .NET 4 और 3.5 के बीच क्यों भिन्न है?
निम्नलिखित छोटी लेकिन पूर्ण उदाहरण व्यवहार मैं हो रही हैं (दोनों XP SP3 और 7 विन 64 पर परीक्षण किया, हमेशा 86 के रूप में संकलित) को दर्शाता है:
class Program
{
static void Main(string[] args)
{
try
{
var hFileMapping = CreateFileMapping(new IntPtr(-1), IntPtr.Zero, 0x04 /* read write */, 0, 0x1000, null);
CloseHandle(hFileMapping);
CloseHandle(hFileMapping);
Console.WriteLine("No exception");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
[DllImport("kernel32", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);
}
जब एक .NET 4 आवेदन के रूप में चलाने के लिए, SEHException
दूसरे CloseHandle
पर फेंक दिया गया है। documentation for CloseHandle
के अनुसार, इस अपेक्षित व्यवहार:
आवेदन एक डिबगर के तहत चल रहा है, समारोह अगर यह या तो एक संभाल मूल्य कि मान्य नहीं है या एक छद्म संभाल मूल्य प्राप्त एक अपवाद फेंक होगा । यह तब हो सकता है जब आप को दो बार संभाल लें, या अगर आप FindFoseFile फ़ंक्शन को कॉलक्लोज फ़ंक्शन को कॉल करने के बजाय एक हैंडल पर क्लोजहैंडल को कॉल करते हैं।
हालांकि, जब एक .NET 3.5 आवेदन (या CLR 2.0) के रूप में संकलित, कोई अपवाद नहीं दूसरा CloseHandle
कॉल पर फेंक दिया जाता है, और संदेश "No exception"
छपा है।
this article के अनुसार, .NET 4 के लिए जारी किए गए अद्यतन सीएलआर में निम्न स्तर के अपवादों के साथ कुछ अलग-अलग डिफ़ॉल्ट व्यवहार हैं जिनमें प्रक्रिया स्थिति को दूषित करने की क्षमता है। हालांकि, जहां तक मैं उस लेख से समझ सकता हूं, पिछले सीएलआर व्यवहार के बारे में कुछ भी नहीं बताया गया है जिससे अपवाद को पूरी तरह से अनदेखा कर दिया जाएगा।
.NET 3.5 (या सीएलआर 2.0) एप्लिकेशन .NET 4 में मौजूद CloseHandle
के दस्तावेज़ व्यवहार का प्रदर्शन क्यों नहीं करता है?
मैं एक के लिए खुश हूं कि एमएस ने इस क्षेत्र में कुछ सुधार किए हैं। मैंने उम्र के लिए यहां मुद्दों के साथ संघर्ष किया: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/ – Brannon
शायद पहले .NET 4 में वे थे बस उन अपवादों को चुपचाप पकड़ना और अनदेखा करना –
जो मुझे पता लगाने में दिलचस्पी है - यह क्यों हो सकता है :) – jeffora