मुझे एमएसडीएन को इंगित किए बिना, क्या इनमें से प्रत्येक के उद्देश्य और उन्हें उपयोग करने के उद्देश्य से कोई संक्षिप्त, स्पष्ट स्पष्टीकरण दे सकता है। (IntPtr, SafeHandle और HandleRef)इंटप्राट, सेफहैंडल और हैंडलरफ - समझाया गया
उत्तर
IntPtr
केवल एक साधारण पूर्णांक-आधारित संरचना है जो एक सूचक (यानी, 32-बिट सिस्टम पर 32 बिट आकार, 64-बिट सिस्टम पर 64-बिट आकार) रख सकता है।
SafeHandle
एक वर्ग है जो Win32 ऑब्जेक्ट हैंडल को पकड़ने के लिए है - इसमें एक फाइनलाइज़र है जो यह सुनिश्चित करता है कि ऑब्जेक्ट जीसीड होने पर हैंडल बंद हो। SafeHandle
एक अमूर्त वर्ग है क्योंकि विभिन्न Win32 हैंडल के पास अलग-अलग तरीके हैं जिन्हें उन्हें बंद करने की आवश्यकता है। SafeHandle
की शुरूआत से पहले, IntPtr
का उपयोग Win32 हैंडल को पकड़ने के लिए किया गया था, लेकिन यह सुनिश्चित करना कि वे ठीक से बंद थे और जीसीएड होने से रोका गया प्रोग्रामर की ज़िम्मेदारी थी।
HandleRef
यह सुनिश्चित करने का एक तरीका है कि एक अप्रबंधित हैंडल जीसीड नहीं है जब आप पी/इनवॉक कॉल के बीच में हों। HandleRef
जैसे कुछ के बिना, यदि आपका प्रबंधित कोड पी/इनवॉक कॉल के बाद हैंडल के साथ कुछ भी नहीं करता है, तो जीसी पी/इनवॉक कॉल के दौरान चलाया गया था, तो यह महसूस नहीं होगा कि हैंडल अभी भी उपयोग में है और जीसी । मुझे कल्पना है (लेकिन मुझे यकीन नहीं है और मैंने नहीं देखा है) SafeHandle
encapsulated हैंडल के प्रबंधन के हिस्से के रूप में HandleRef
का उपयोग कर सकते हैं।
HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);
समस्या यह है कि जब "एक" निपटान किया जाता है, यह संभाल बंद हो जाएगा:
मामूली सुधार। जब आप PInvoke के दौरान * प्रबंधित * ऑब्जेक्ट GC'ed नहीं चाहते हैं तो HandleRef का उपयोग करें। उदाहरण कक्षा एचडब्ल्यूएनडी {सार्वजनिक IntPtr हैंडल; } एचडब्ल्यूएनडी = = नया एचडब्ल्यूएनडी(); बी। सैंडमेसेज (ए। हैंडल, ...); <- PInvoke बी.एंडेंडमेसेज (नया हैंडलरफ (ए, ए। हैंडल)) में जीसीड किया जा सकता है <- अब पीएनवोक –
में जीसीड नहीं किया जा सकता है एक और अतिरिक्त: 'सेफहैंडल' में संदर्भ गणना शामिल है हैंडल रीसाइक्लिंग हमलों को रोकने के लिए। –
क्या कोई भी सुरक्षित हैंडलफ्रेंड का उपयोग कर सकता है?या कम से कम एक समान तंत्र है? – Assimilater
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);
इस मान लिया जाये कि "एक" कार्यक्रम में, इस के बराबर है करने के लिए केवल संदर्भ है। यदि यह SendMessage पर कॉल के पहले या उसके दौरान होता है, तो हैंडल अमान्य होगा।
हैंडलरफ एच के साथ कार्यक्रम के पहले किए गए कचरे से "ए" को रोकता है।
यह SafeHandle की तरह लग रहा HandleRef के KeepAlive व्यवहार कैसे शामिल करता है: Project Roslyn SafeHandle.cs http://referencesource.microsoft.com/#mscorlib/system/runtime/interopservices/safehandle.cs,743afbddafaea263
/*
Problems addressed by the SafeHandle class:
1) Critical finalization - ensure we never leak OS resources in SQL. Done
without running truly arbitrary & unbounded amounts of managed code.
2) Reduced graph promotion - during finalization, keep object graph small
3) GC.KeepAlive behavior - P/Invoke vs. finalizer thread ---- (HandleRef)
<...>
*/
लेकिन मैं यकीन नहीं है, यह keepalive व्यवहार की तरह दिखता है केवल निर्माता को गलत मूल्य प्रदान करके प्राप्त किया जा सकता जो केवल ऑब्जेक्ट को अंतिम रूप देने योग्य नहीं है, इसलिए आपको उस मामले में संसाधन रिसाव को रोकने के लिए सेफहैंडल के निपटान() मैनुअल को कॉल करना होगा, क्या मैं सही हूँ? कोई स्रोत कोड की व्याख्या कर सकते, क्या
private extern void InternalDispose();
private extern void InternalFinalize();
है?
- 1. जावा मेमोरी समझाया गया (सन जेवीएम)
- 2. सी # उपयोग आईडीस्पोजेबल या सेफहैंडल?
- 3. इंटप्राट बनाम रेफरी सी #
- 4. इंटप्राट को बाइट *
- 5. एसओए शासन ने समझाया
- 6. रूबी कोड समझाया
- 7. हैंडलरफ और जीसीएचंडल के बीच क्या अंतर है?
- 8. जो उपयोग करने के लिए बेहतर/सुरक्षित है: हैंडलरफ या इंटप्रेट (माइक्रोसॉफ्ट से नया स्रोत कोड अब हैंडलरफ का उपयोग नहीं करता है)
- 9. .NET4: इन-प्रक्रिया साइड-बाई-साइड निष्पादन समझाया
- 10. मुझे यह "[\\? &] V = ([^ & #] *)" इंटरनेट पर किसी ने मुझे यह समझाया
- 11. ओरेकल और ट्राइगर्स (डाला गया, अपडेट किया गया, हटाया गया)
- 12. 'इस' कीवर्ड को सर्वोत्तम और सरल तरीके से कैसे समझाया जाए?
- 13. 'डाला' और 'हटाया गया' टेबल
- 14. 'पर बनाया गया' और 'अपडेट किया गया' फ़ील्ड
- 15. ओरेकल में पूर्ण बाहरी शामिल होने का अजीब व्यवहार - इसे कैसे समझाया जा सकता है?
- 16. एमवीसी (मॉडल-व्यू-कंट्रोलर) - क्या इसे सरल शब्दों में समझाया जा सकता है?
- 17. यूटीएफ 8 बनाम यूटीएफ 16 बनाम चार * बनाम क्या? किसी ने मुझे यह गड़बड़ समझाया!
- 18. एक सहयोगी को कैसे समझाया जाए कि कोड डुप्लिकेशन खराब है?
- 19. वेबलॉगिक और ओरेकल: अटक गया निष्पादन
- 20. htaccess - सशर्त पुनर्लेखन और समाप्त हो गया
- 21. iText 5.0.0 आरटीएफ और एचटीएमएल कहां गया?
- 22. swprintf और vswprintf घोषित नहीं किया गया?
- 23. यदि jQuery क्लिक किया गया है/केंद्रित
- 24. चुना गया विकल्प टूट गया है या ...?
- 25. रेल 2.3.X - अनुरोध के बाद कोड निष्पादित किया गया और लौटा दिया गया?
- 26. आईई 8 में जीडब्ल्यूटी - अपवाद फेंक दिया गया और पकड़ा नहीं गया
- 27. UISearchBar और ईवेंट को निकाल दिया गया जब 'एक्स' तत्व टैप किया गया
- 28. स्थानीय अधिसूचना ट्रिगर जब अनइंस्टॉल किया गया और ऐप को पुनर्स्थापित किया गया
- 29. फ़ाइल कैसे बनाया गया, एक्सेस किया गया और संशोधित दिनांक विंडोज गुणों के समान ही है?
- 30. cudamemcpy त्रुटि: "लॉन्च का समय समाप्त हो गया और इसे समाप्त कर दिया गया"
एमएसडीएन के साथ क्या गलत है? –
कुछ भी नहीं। यह सुनिश्चित करने के लिए कि मैं उन्हें सही तरीके से उपयोग कर रहा हूं, बस प्रत्येक का एक संक्षिप्त सारांश ढूंढ रहा हूं। अगर मैं एमएसडीएन और अन्य लोगों के विवरण पढ़ता हूं तो मुझे बेहतर लगता है कि मैं जो कर रहा हूं वह सही है। – user62572