2009-04-22 9 views
7

मैं इन दो देशी Win32 कार्यों के साथ चारों ओर खेल रहा हूँ के साथ Marshal.ReleaseComObject उपयोग कैसे करें:Win32 देशी कार्यों

[DllImport("oleacc.dll")] 
    public static extern int AccessibleObjectFromWindow(
      IntPtr hwnd, 
      int dwObjectID, 
      ref Guid refID, 
      ref Accessibility.IAccessible ppvObject); 
    [DllImport("oleacc.dll")] 
    public static extern uint AccessibleChildren(
     Accessibility.IAccessible paccContainer, 
     int iChildStart, 
     int cChildren, 
     [Out] object[] rgvarChildren, 
     out int pcObtained); 

और मैं एक मुश्किल समय पता लगाना अगर मैं ऐसा करना चाहिए/मार्शल कॉल करने के लिए की जरूरत हो रही है किसी भी लौटे ऑब्जेक्ट्स पर ReleaseComObject। मैं आभारी हूं कि कोई इस विषय पर मुझे प्रबुद्ध कर सकता है! यहां एक नमूना उपयोग करें: यदि आप वास्तव में के बजाय जीसी को चलाने के लिए इंतजार कर के, तुरंत रिहाई लागू करने के लिए जीसी प्राप्त करने की आवश्यकता

Accessibility.IAccessible test(
     int hWnd, 
     string accessName) 
    { 
     Guid guidCOM = new Guid(0x618736E0, 0x3C3D, 0x11CF, 0x81, 0xC, 0x0, 0xAA, 0x0, 0x38, 0x9B, 0x71); 
     Accessibility.IAccessible a = null; 

     AccessibleObjectFromWindow(
      new IntPtr(hWnd), 
      -4, 
      ref guidCOM, 
      ref a); 
     object[] children = new object[a.accChildCount]; 
     int z; 
     AccessibleChildren(a, 0, children.Length, children, out z); 
     foreach (Accessibility.IAccessible a2 in children) 
      try 
      { 
       if (a2.get_accName(0) == accessName) 
        return a2; 
      } 
      catch 
      { 
      } 
     return null; 
    } 

उत्तर

6

Marshal.ReleaseComObject एक उपयोगी काम के आसपास है। यह सबसे अच्छा है जब तक आप वास्तव में, की जरूरत है, क्योंकि यह आपके कोड पर कब्जा करने की प्रवृत्ति है और आप इसे स्थानों पर जहां आप अंतर्निहित संदर्भ बनाया है सहित हर जगह, आवेदन करना है इसका इस्तेमाल नहीं करने के लिए।

मुझे लगता है कि नेट में COM इंटरॉप लिए सबसे अच्छा तरीका तरीकों का उपयोग कर रहे चारों ओर दृढ़ता से टाइप किया आवरण वर्गों लिखने के लिए है। इस तरह वहाँ अंतर्निहित संदर्भ शुरू करने की कोई संभावना नहीं है, और यह कोड को आसान बनाने और सुनिश्चित करें कि इंटरफेस जीसी के लिए और अधिक आसानी से पहुंचा जा सकता है जाएगा। मेरी गाय-orkers में से कुछ इस विधियों का उपयोग करके बेहतर स्मृति व्यवहार की सूचना दी है - वस्तुओं एक समय पर फैशन में जारी कर रहे हैं के रूप में जीसी चारों ओर झूठ बोल रही है किसी भी रहस्य संदर्भ से बाहर निकले बिना चलाता है।

आम तौर पर, नेट कोड में संदर्भित सभी COM ऑब्जेक्ट्स को आरसीडब्लू ऑब्जेक्ट के रूप में कार्यान्वित किया जाता है, जिसमें वास्तविक COM संदर्भ होता है - ReleaseComObject पर कॉल आरसीडब्ल्यू को संदर्भित करने के लिए आरसीडब्ल्यू को संदर्भित करता है। इस तरह यह सिर्फ वास्तविक IUnkown उदाहरण पर Release बुला के समान है। शायद आपके ऊपर जैसा उदाहरण है, कॉल करना आवश्यक नहीं है।

+0

"सबसे अच्छा उपयोग करने के लिए नहीं यह" है * बहुत विशिष्ट * संदर्भ के लिए। उदाहरण के लिए Outlook एड-इन से निपटने पर, * बस सब कुछ मैन्युअल रूप से जारी किया जाना चाहिए *। ऐसा नहीं करने से कुछ वास्तव में अजीब त्रुटियां होती हैं ("ओवर-रिलीज़िंग" वही करता है, इसलिए बहुत सटीक स्वामित्व अर्थशास्त्र को कोड में काम करने की आवश्यकता होती है)। देखें [.NET में विकसित Office एड-इन्स में COM ऑब्जेक्ट्स को कब रिलीज़ करें] (http://www.add-in-express.com/creating-addins-blog/2008/10/30/releasing-office-objects- शुद्ध /)। –

+0

... दूसरी तरफ [मार्शल.रलीज कॉम ऑब्जेक्ट कन्फेयरिंग डेंजरस] (http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-cononsidered-dangerous.aspx)। यह सब के बारे में सिर्फ क्रमी है। –

+0

दरअसल, पीएसटी, वीएस टीम की लंबी हवा वाली कहानी मुझे एक विशेष मामला होने के लिए प्रतीत होती है। इस कहानी के संदर्भ में इस पहले ब्लॉग पोस्ट में यहां छोटी कहानी को कैप्चर किया गया है: http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355.aspx। यह मार्शल.ReleaseComObject का उपयोग करने के लिए कुछ सरल, आसान नियमों का पालन करता है। – Cheeso