2010-05-05 18 views
7

पर प्रतिबिंब का उपयोग कर मैं एक COM वस्तु ... जो इस तरह बनाई गई है का एक उदाहरण है:आह्वान विधि COM ऑब्जेक्ट

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application"); 
Object application = Activator.CreateInstance(type); 

जब मैं एक विधि को लागू करने की कोशिश:

type.GetMethod("RefreshAll").Invoke(application, null); 

- >type.GetMethod("RefreshAll")null देता है। जब मैं type.GetMethods() साथ सभी तरीकों प्राप्त करने की कोशिश, वहाँ केवल इन तरीकों है:

  1. GetLifetimeService
  2. InitializeLifetimeService
  3. CreateObjRef
  4. ToString
  5. बराबर
  6. GetHashCode
  7. GetType

ताज़ा करें सभी विधि कहां है? और मैं इसे कैसे बुला सकता हूं?

this.application.GetType().InvokeMember("RefreshAll", BindingFlags.InvokeMethod, null, this.application, null); 

मैं का उपयोग करता है COM तो यह आप के लिए ठीक से काम करना चाहिए पुराने परियोजना में इस तरह से उपयोग कर रहा हूँ:

उत्तर

12

आप COM ऑब्जेक्ट पर GetMethod उपयोग नहीं कर सकते, आप एक अलग तरह से उपयोग करना होगा।

+1

हालांकि समय में एक अच्छा जवाब है, # 4 ग यह बहुत आसान – MickyD

+1

ध्यान दें नीचे 'dynamic' कीवर्ड के माध्यम से COM-इंटरॉप प्रदर्शन करने के लिए,' dynamic' मेरी उपकरण https में उपयोग करने से आने वाले बनाता है : //github.com/awaescher/RepoZ मैंने इसके साथ भारी मेमोरी लीक की खोज की। मैंने इसे ठीक करने के लिए नाथन डब्ल्यू के जवाब पर स्विच किया! यहां और देखें: https://stackoverflow.com/questions/33080252/memory-overflow-having-an-increasing-number-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

मिकी डी के जवाब पर अन्य टिप्पणियां देखें कि कैसे इस मुद्दे से निपटें ... – Waescher

4

मुझे पता है यह एक देर से जवाब लेकिन सी # 4 चीजें बदल जाता dynamic कीवर्ड जो मन में COM-इंटरॉप साथ डिजाइन किया गया था की शुरूआत के साथ एक सा है।

MSDN:

COM इंटरॉप परिदृश्य है कि सी # टीम विशेष रूप से सी # 4 रिलीज में लक्षित ऐसे वर्ड और एक्सेल के रूप में माइक्रोसॉफ्ट ऑफिस अनुप्रयोगों, के खिलाफ प्रोग्रामिंग किया गया था। इस कार्य को सी # में आसान और प्राकृतिक बनाना था क्योंकि यह हमेशा विजुअल बेसिक में था। [1]

आपका कोड अब हो जाता है:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application"); 
dynamic application = Activator.CreateInstance(type); 
application.RefreshAll(); // <---- new in c# 4 

अब आप RefreshAll() दृश्य स्टूडियो बयान पूरा होने इतना परेशान न में नहीं देख सकेंगे। यह संकलित होगा।

[1] Understanding the Dynamic Keyword in C# 4

+1

ध्यान दें, मेरे उपकरण में 'गतिशील' का उपयोग करने से आ रहा है https://github.com/awaescher/RepoZ मैंने इसके साथ भारी मेमोरी लीक की खोज की। मैंने इसे ठीक करने के लिए नाथन डब्ल्यू के जवाब पर स्विच किया! यहां और देखें: https: // stackoverflow।कॉम/प्रश्न/33080252/मेमोरी-ओवरफ्लो-होने-बढ़ते-संख्या-माइक्रोसॉफ्ट-सीएसएआरएपी-रनटाइमइंडर-एस/34123315 – Waescher

+0

@ वेसर ने विचार किया कि एमएस ने इसे पहली जगह COM के लिए बनाया था। मुझे संदेह है कि आप केवल चीजों को ठीक से जारी नहीं कर रहे हैं जिनके पास ** गतिशील ** – MickyD

+0

@ वेशेर ओह के साथ कुछ लेना देना नहीं है मैंने अभी कुछ गुगल किया है और ऐसा लगता है कि आप सही हैं। गंदा छोटा ** गतिशील **। अच्छा खोज – MickyD

संबंधित मुद्दे