मैं एक .NET एप्लिकेशन लिख रहा हूं जहां मुझे एपीआई कॉल (वास्तव में) का उपयोग करना है। विन एपीआई के फ़ंक्शन CoCreateInstance() को कॉल करके मेरा एप्लिकेशन COM इंटरफेस प्राप्त करता है।

बेशक, मुझे उनके साथ समाप्त होने पर उन इंटरफेस को जारी करना होगा। मुझे लगता है कि ऐसा करने का उपयुक्त तरीका Marshal.Release() है (कम से कम, मेरे दिमाग में कोई अन्य उचित तरीका नहीं आता है)।

अब, मैं प्रत्येक संबंधित इंटरफ़ेस पॉइंटर को एक सुरक्षित हैंडल बनाना चाहता हूं। ऐसा करने के लिए, मुझे SafeHandle से अपना खुद का सुरक्षित हैंडल वर्ग प्राप्त करना होगा और व्युत्पन्न वर्ग में ReleaseHandle() को ओवरराइड करना होगा। संबंधित दस्तावेज़ीकरण बताता है:

[...] विशेष रूप से, रिलीजहैंडल से कॉल करने वाले किसी भी तरीके पर ReliabilityContractAttribute विशेषता लागू करें। ज्यादातर मामलों में यह कोड होना चाहिए: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success) [...]

यह मेरी समस्या है: मुझे नहीं पता कि Marshal.ReleaseHandle() के पास पहले से ही डिफ़ॉल्ट रूप से यह अनुबंध है, और यदि नहीं, तो मैं इसे कैसे जोड़ सकता हूं। मुझे लगता है कि यहां कुछ बुनियादी बातों की कमी है। क्या वहां कोई कृपया इस पर कुछ प्रकाश डाल सकता है?

1
Binarus 8 फरवरी 2017, 19:14
विंडोज एपीआई विंडो आवंटन विधि का उपयोग करता है और मेमोरी को विंडोज नियमों के आधार पर जारी किया जाएगा न कि नेट लाइब्रेरी नियमों के आधार पर। केवल विन एपीआई जो स्मृति धारण करते हैं उन्हें विंडोज़ विधि का उपयोग करके रिलीज़ करने की आवश्यकता होती है।
 – 
jdweng
8 फरवरी 2017, 19:20
हालांकि यह सच हो सकता है, मुझे लगता है कि यह यहां की स्थिति पर लागू नहीं होता है। COM इंटरफेस के साथ एक विशेष स्थिति है। मेरा प्रश्न COM इंटरफेस प्राप्त करने और जारी करने से संबंधित है (मूल रूप से उनके संदर्भ काउंटरों को बढ़ाना और घटाना), स्मृति क्षेत्रों को आवंटित या मुक्त करने के लिए नहीं। एक साइड नोट के रूप में, आप जानते होंगे कि COM ऑब्जेक्ट्स स्वयं को नष्ट कर देते हैं यदि उनके सभी इंटरफेस के संदर्भ काउंटर शून्य तक पहुंच गए हैं (हालांकि इसका मेरे प्रश्न से कोई लेना-देना नहीं है)।
 – 
Binarus
8 फरवरी 2017, 19:29
1
क्या बस कोड की जाँच करने से इसका उत्तर मिलेगा? सार विधि में विशेषता है [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
 – 
user1228
8 फरवरी 2017, 19:45
बढ़िया, आपने बिल्कुल मेरे प्रश्न का उत्तर दिया है - कभी-कभी मैं मूर्ख हूं। यदि आप अपनी टिप्पणी का उत्तर देते हैं तो मैं इसे स्वीकार करूंगा। मैंने संदर्भ स्रोत पर हर समय SafeHandle के कार्यान्वयन को पढ़ा है, लेकिन स्पष्ट रूप से Marshal के कार्यान्वयन को भी पढ़ने का विचार नहीं आया ...
 – 
Binarus
8 फरवरी 2017, 19:54

1 उत्तर

सबसे बढ़िया उत्तर

सार विधि की परिभाषा Marshal.Release है

[System.Security.SecurityCritical]  // auto-generated_required
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int /* ULONG */ Release(IntPtr /* IUnknown */ pUnk );

तो यह पहले से ही ReliabilityContractAttribute से सजाया गया है। आप किसी डीकंपाइलर (मैंने JustDecompile का इस्तेमाल किया) या referencesource.microsoft.com< पर जाकर किसी भी प्रकार के ढांचे के स्रोत की जांच कर सकते हैं। /ए>.

2
8 फरवरी 2017, 21:01
उत्तर को स्वीकार करते हुए, हालांकि आप शायद Marshal.Release() (SafeHandle.ReleaseHandle() के बजाय) का कोड दिखाना चाहते थे :-)
 – 
Binarus
8 फरवरी 2017, 20:37
हा! मैं पलट गया, हाँ। अपडेट किया गया।
 – 
user1228
8 फरवरी 2017, 21:02