c# - Releasing temporary COM objects -
COM ऑब्जेक्ट का उपयोग कर निम्न C # कोड पर विचार करें।
MyComObject ओ = नया MyComObject; कोशिश {var baz = o.Foo.Bar.Baz; कोशिश {/ baz} के साथ कुछ करो} अंत में {मार्शल। रीलीज कॉम ऑब्जेक्ट (बाज़); }} अंत में {Marshal.ReleaseComObject (o); }
यह COM ऑब्जेक्ट्स ओ
और baz
जारी करेगा, लेकिन o.Foo < / कोड> और
o.Foo.Bar
। इससे समस्याएं हो सकती हैं, जब उन वस्तुओं में बड़ी संख्या में अप्रबंधित स्मृति या अन्य संसाधन हैं।
एक स्पष्ट लेकिन बदसूरत समाधान, कोड को और भी अधिक try-end
और मार्शल। रीलीज कॉम ऑब्जेक्ट
।
एक वैकल्पिक हल के रूप में, मैंने एक सहायक वर्ग बनाया है
वर्ग अस्थायी कॉम-ऑब्जेक्ट्स: IDisposable {सार्वजनिक सी टी & lt; C & gt; (सी कॉम ऑब्जेक्ट) {m_objects.Add (comObject); वापसी comObject; } सार्वजनिक शून्य निकालना () {foreach (ऑब्जेक्ट ओ में m_objects) मार्शल। रीलीज कॉम ऑब्जेक्ट (ओ); }}
उपयोग:
का उपयोग कर (अस्थायी कॉम ऑब्जेक्ट्स टी = नया अस्थाई कॉम ऑब्जेक्ट ()) {MyComObject ओ = टी। टी। (नया MyComObject); Var बज़ = टी.टी. (टी.टी. (टी.टी. (ओ.एफू)। बार्स)। बज़); // baz} के साथ कुछ करें
मेरे प्रश्न: क्या इस कोड के साथ संभावित समस्याएं हैं? क्या कोई और अधिक सुरुचिपूर्ण समाधान है?
मेरी सबसे बड़ी पोटीन नाम होगा, T ;
जोड़ें
उपयोग के अधिक भ्रमित हो सकता है मैं भी जहां T: class
को जेनेरिक पद्धति में जोड़ता हूं, लेकिन "धाराप्रवाह एपीआई" प्रयोग करने योग्य लगता है मैं भी कोड थोड़ा थोड़ा समतल करने के लिए इच्छुक था मैं एक पूरे पेड़ पर चलने और सभी मध्यवर्ती चरणों पर कब्जा करने के लिए अभिव्यक्ति
API का उपयोग करने के कुछ तरीकों को देख सकता हूं, लेकिन यह तुच्छ नहीं होगा - लेकिन कल्पना करें:
का उपयोग कर (var com = new SomeWrapper ()) {var baz = com.Add (() = & gt; नया MyComObject ()। Foo.Bar.Baz); }
जहां यह अभिव्यक्ति का पेड़ है और हम मध्यस्थों को स्वचालित रूप से प्राप्त करते हैं।
(भी, आप साफ़ ()
या रिक्त
सूची में विच्छेदन ()
)
इसी तरह:
स्थिर वर्ग ComExample {स्थिर शून्य मुख्य () ({Var wrapper = new ReleaseWrapper ()) का उपयोग करके {var baz = wrapper.Add (() = & gt; नया Foo ()। Bar.Baz); Console.WriteLine (baz.Name); }}} वर्ग रिलीज़ वेपर: IDisposable {सूची & lt; वस्तु & gt; वस्तुओं = नई सूची & lt; ऑब्जेक्ट & gt; (); सार्वजनिक टी जोड़ें & lt; T & gt; (अभिव्यक्ति & lt; फ़नक & lt; T & gt; & gt; func) {वापसी (टी) चलना (func.Body); } वस्तु चलना (अभिव्यक्ति expr) {ऑब्जेक्ट obj = WalkImpl (expr); अगर (obj! = नल & amp; मार्शल। आईएसओ कॉम ऑब्जेक्ट (ओबीजे) & amp; ऑब्जेक्ट्स। कंटन (ओबीजे)) {ऑब्जेक्ट्स.एड (ओबीजे); } वापसी obj; } वस्तु [] चलना (IEnumerable & lt; अभिव्यक्ति & gt; आर्ग्स) {if (args == null) return null; वापसी आर्ग्स। चयन (arg = & gt; वाक् (आर्ग))। ToArray (); } वस्तु WalkImpl (अभिव्यक्ति expr) {स्विच (expr.NodeType) {केस अभिव्यक्ति प्रकार। कॉन्स्टेंट: रिटर्न ((कॉन्स्टैंटएक्सप्रेस) एक्सपीआर)। वेल्यू; केस अभिव्यक्ति टाइप। नया: नया एक्सपेरशन ने = (न्यू एक्सप्रेशन) एक्सप्र; वापसी ne.Constructor.Invoke (चलो (ne.Arguments)); मामले अभिव्यक्ति प्रकार। मेम्बर प्रवेश: सदस्य अभिव्यक्ति = = (सदस्य अभिप्राय) expr; ऑब्जेक्ट लक्ष्य = चलना (me.Expression); स्विच (me.Member.MemberType) {केस सदस्य प्रकार.फिल्ड: वापसी ((FieldInfo) me.Member) .GetValue (लक्ष्य); मामला सदस्य प्रकार। प्रॉपर्टी: वापसी ((प्रॉपर्टी इन्फॉ।) Me.Member) .GetValue (लक्ष्य, रिक्त); डिफ़ॉल्ट: नया NotSupportedException फेंकना (); } केस अभिव्यक्ति टाइप। कॉल: विधिकॉल एक्सपेशन एमसीएस = (मेथडक्लएक्सप्रेस) एक्सपीआर; वापसी mce.Method.Invoke (चलो (mce.Object), चलो (mce.Arguments)); डिफ़ॉल्ट: नया NotSupportedException फेंकना (); }} सार्वजनिक शून्य निकालना () {foreach (वस्तु obj वस्तुओं में) {मार्शल। डीबग। विरलाइन ("जारी किया गया:" + obj); } ऑब्जेक्ट्स। क्लीयर (); }}
Comments
Post a Comment