2010-08-31 15 views
5

मैं पीचट्री एपीआई के लिए एक आवेदन लिख रहा हूं और इसे एपीआई के किसी भी संस्करण के साथ काम करने की जरूरत है। दुर्भाग्य से पीचट्री 2011 का डीएल पीचट्री 2010 से बातचीत नहीं कर सकता है, और इसके विपरीत, भले ही दो डीएल एक ही स्थान पर संग्रहीत हों और बिल्कुल उसी कोड के साथ चलें।रनटाइम पर एक COM डीएल लोड करें?

मैंने सोचा कि मुझे इसके फ़ाइल पथ से डीएलएल को संदर्भित करने में सक्षम होना चाहिए, झूठ पर विशिष्ट संस्करण छोड़ना चाहिए, झूठ पर इंटरऑप प्रकार एम्बेड करें, और स्थानीय को गलत पर कॉपी करें और यह मशीन के किसी भी संस्करण का उपयोग करेगा, लेकिन मैं जब मैं ऐसा करता हूं तो एक त्रुटि प्राप्त करें - "एक आमंत्रण के लक्ष्य से अपवाद फेंक दिया गया है।"

क्या यह COM है, भले ही डीएल को देर से बांधने का कोई तरीका है?

मैं जो भी सोचता हूं उसके कोड नमूने प्रदान कर सकता हूं, लेकिन यह किसी भी चीज़ की तुलना में एक परियोजना सेटअप समस्या है।

संपादित करें: आपकी मदद के लिए बहुत बहुत धन्यवाद। मैंने एक अलग व्यक्ति के प्रश्न पर अपना समाधान पाया और इसे यहां पोस्ट किया।

+0

आमतौर पर आप संकलन समय पर इंटरऑप डीएलएल को लिंक करते हैं, और यदि यह सिस्टम पर मौजूद है, तो यह रनटाइम पर COM dll लोड करेगा। क्या त्रुटि, या आंतरिक अपवाद में कोई और जानकारी है? क्या कोई त्रुटि कोड है (0xZZZZZZZZ)? क्या आप स्टैक ट्रेस को लिंक कर सकते हैं, या यह है कि आपके ऐप के बारे में बहुत अधिक जानकारी दे रही है? पीचट्री एपीआई, क्या यह COM है, या यह एक डीएलएल है जो COM से लिंक है? –

उत्तर

7

COM ऑब्जेक्ट्स के लिए देर-बाध्यकारी की आवश्यकता है कि आप COM .NET प्रोजेक्ट में COM लाइब्रेरी का संदर्भ न जोड़ें। इसके बजाय, आप कुछ इस तरह COM ऑब्जेक्ट बनाने के लिए उपयोग करना चाहिए:

Type type = Type.GetTypeFromProgID("Excel.Application") 
    object app = Activator.CreateInstance(type); 

फिर, यह क्रम में COM पुस्तकालय के किसी भी संस्करण के लिए बाध्य होगा। अधिक जानकारी के लिए

this article देखें।

+1

और .NET 4.0 के साथ आप नए 'गतिशील' प्रकार का उपयोग कर सकते हैं और देर से विधि कॉल बाइंडिंग कर सकते हैं, एक प्रकार संदर्भ जोड़ने की आवश्यकता को समाप्त कर सकते हैं http://msdn.microsoft.com/en-us/library/dd264736.aspx –

+0

एक चीज जो मैं जोड़ना चाहता हूं वह यह है कि, जब आप ऑब्जेक्ट को उदाहरण बनाते हैं, तो आप इसे सही इंटरफ़ेस प्रकार पर डाल सकते हैं, इसलिए आपके पास स्थिर बाध्यकारी है, भले ही सृजन देर से बाध्य हो। – zumalifeguard

+0

आपकी मदद के लिए धन्यवाद। आपके विचारों ने मुझे सही रास्ते पर पहुंचाया। – Yoenhofen

0

यह समाधान

Compile a version agnostic DLL in .NET

मामले में कि कभी लिंक मर जाता है, कुंजी नीचे की तरह AppDomain.CurrentDomain.AssemblyResolve घटना को संभालने के लिए है। इवेंट असेंबली बाध्यकारी विफल होने पर किसी भी समय आग लगती है, इसलिए आप संस्करण विवादों को ठीक करने, इसे स्वयं हल कर सकते हैं।

using System.Reflection; 

static Program() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) 
    { 
     AssemblyName requestedName = new AssemblyName(e.Name); 

     if (requestedName.Name == "Office11Wrapper") 
     { 
      // Put code here to load whatever version of the assembly you actually have 

      return Assembly.LoadFile("Office11Wrapper.DLL"); 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 
संबंधित मुद्दे