मैं एक .NET एप्लिकेशन लिख रहा हूं जहां मुझे एपीआई कॉल (वास्तव में) का उपयोग करना है। विन एपीआई के फ़ंक्शन CoCreateInstance()
को कॉल करके मेरा एप्लिकेशन COM इंटरफेस प्राप्त करता है।
बेशक, मुझे उनके साथ समाप्त होने पर उन इंटरफेस को जारी करना होगा। मुझे लगता है कि ऐसा करने का उपयुक्त तरीका Marshal.Release()
है (कम से कम, मेरे दिमाग में कोई अन्य उचित तरीका नहीं आता है)।
अब, मैं प्रत्येक संबंधित इंटरफ़ेस पॉइंटर को एक सुरक्षित हैंडल बनाना चाहता हूं। ऐसा करने के लिए, मुझे SafeHandle
से अपना खुद का सुरक्षित हैंडल वर्ग प्राप्त करना होगा और व्युत्पन्न वर्ग में ReleaseHandle()
को ओवरराइड करना होगा। संबंधित दस्तावेज़ीकरण बताता है:
[...] विशेष रूप से, रिलीजहैंडल से कॉल करने वाले किसी भी तरीके पर ReliabilityContractAttribute विशेषता लागू करें। ज्यादातर मामलों में यह कोड होना चाहिए: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success) [...]
यह मेरी समस्या है: मुझे नहीं पता कि Marshal.ReleaseHandle()
के पास पहले से ही डिफ़ॉल्ट रूप से यह अनुबंध है, और यदि नहीं, तो मैं इसे कैसे जोड़ सकता हूं। मुझे लगता है कि यहां कुछ बुनियादी बातों की कमी है। क्या वहां कोई कृपया इस पर कुछ प्रकाश डाल सकता है?
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< पर जाकर किसी भी प्रकार के ढांचे के स्रोत की जांच कर सकते हैं। /ए>.
Marshal.Release()
(SafeHandle.ReleaseHandle()
के बजाय) का कोड दिखाना चाहते थे :-)
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।
SafeHandle
के कार्यान्वयन को पढ़ा है, लेकिन स्पष्ट रूप सेMarshal
के कार्यान्वयन को भी पढ़ने का विचार नहीं आया ...