2008-12-03 18 views
6

बहुत अजीब असेंबली संदर्भ समस्या और लोडिंग समस्या है जो मुझे अपने Outlook एडिन के साथ अनुभव करता है।COM इंटरऑप असेंबली लोडिंग अनुक्रम

मैं एक पुराने आउटलुक ऐड, लिखा है और नेट 1.1 का उपयोग कर निर्माण: यहाँ विस्तार (एक लम्बी कहानी :)) कर रहे हैं। एडिन को अपने स्वयं के एप्लिकेशन डोमेन में एक अप्रबंधित शिम का उपयोग करके लोड किया जाता है। यह ठीक है, नेट 2.0 के साथ, भले ही 1.1 उपयोगकर्ता की मशीन पर मौजूद न हो।

एडिन एक कस्टम आउटलुक इंटरऑप असेंबली का उपयोग करता है, जिसे Outlook 2000 के विरुद्ध वीएस 2003 द्वारा बनाया गया है, और उस पुनर्निर्माण के बाद दृढ़ता से नामित किया जाना चाहिए (जैसा कि मेरा एडिन है)।

एडिन प्रोजेक्ट में मैं केवल इस कस्टम इंटरऑप असेंबली का संदर्भ देता हूं, आधिकारिक एमएस इंटरऑप असेंबली का कोई संदर्भ नहीं।

जब इस एडिन का उपयोग Outlook 2007 और .NET 2.0 के साथ किसी वातावरण में किया जाता है, जहां आधिकारिक एमएस इंटरऑप असेंबली जीएसी में स्थापित होते हैं, तो किसी कारण से मैं देखता हूं कि एडिन लोड और उनका उपयोग करता है।

using Outlook; 

जो अपने कस्टम इंटरॉप विधानसभा के नाम का स्थान:

कनेक्ट वर्ग के कोड में, मैं एक का उपयोग कर निर्देश दिया है।

Assembly.LoadFrom(PATHTOMYASSEMBLY + "Interop.Outlook.dll"); 
Type type = typeof(Outlook.ApplicationClass); 
logger.Debug("Outlook.Application full type is: {0}", type.AssemblyQualifiedName); 

यह आउटपुट:

Outlook.Application पूर्ण प्रकार है:

कनेक्ट ctor में मैं (परीक्षण प्रयोजनों के लिए जोड़ा) कोड की इन पंक्तियों है Outlook.ApplicationClass, इंटरॉप .उत्पाद, संस्करण = 9.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = 4cfbdc5349cf59d8

जो वही है जो मैं अपेक्षा करता हूं।

समस्या है, जब OnConnection कहा जाता है, मैं लॉग में देखते हैं (वस्तु आवेदन, Extensibility.ext_ConnectMode ConnectMode, AddInInst, रेफरी System.Array कस्टम वस्तु) (मैं के AssemblyLoad घटना के लिए एक हुक है वर्तमान डोमेन) कि एमएस इंटरॉप विधानसभा के साथ-साथ भरी हुई है:

private void app_domain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) 
{ 
    Assembly loadedAssembly = args.LoadedAssembly; 
    logger.Debug("Assembly {0} is loaded from: {1}", loadedAssembly.FullName, loadedAssembly.GlobalAssemblyCache ? "GAC" : loadedAssembly.Location); 
} 

आउटपुट:

विधानसभा Microsoft.Office.Interop.Outlook, संस्करण = 12.0.0.0, संस्कृति = n eutral, PublicKeyToken = 71e9bce111e9429c से लोड है: GAC

मेरे OnConnection विधि इस तरह शुरू होता है:

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) 
{ 
    Type type = application.GetType(); 
    logger.Debug("OnConnection application object's full type is: {0}", type.AssemblyQualifiedName); 

    Outlook.Application applicationObject = (Outlook.Application)application; 

यह आउटपुट:

OnConnection आवेदन वस्तु का पूरा प्रकार है: माइक्रोसॉफ्ट.ऑफिस.इंटरोप.ऑटlook.एपप्लिकेशंस क्लास, माइक्रोसॉफ्ट.ऑफिस.इंटरोप।आउटलुक, संस्करण = 12.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = 71e9bce111e9429c

यह वास्तव में अजीब है, जैसा कि आप देख सकते हैं कि अगली पंक्ति मैं सफलतापूर्वक बिना किसी समस्या के Outlook.Application पर कास्ट कर सकते हैं।

मैंने प्रतिबिंबक के साथ जांच की है, और मेरी असेंबली किसी भी तरह से माइक्रोसॉफ्ट के इंटरऑप असेंबली का संदर्भ नहीं देती है। मेरे Interop.Outlook.dll के लिए वही।

तो, क्या कोई जानता है कि क्या हो रहा है? इन सवालों के जवाब क्या हैं:

  1. यह माइक्रोसॉफ्ट असेंबली को क्यों लोड करता है?

  2. यह कैसे असंबंधित वर्गों/इंटरफ़ेस के बीच कास्ट करने के लिए संभव है, अलग अलग विधानसभाओं में परिभाषित किया गया?

नोट: मैं एक नया ऐड, सबसे सरल प्रश्न है, जो कुछ भी नहीं है, बस लोड करता है बनाया है। मैं समस्या का पुनरुत्पादन कर सकता हूं, वास्तव में, क्या कोई जानता है कि सीएलआर कैसे तय करता है कि लोड करने के लिए इंटरऑप क्या है और कहां से। जीएसी के अलावा, क्या कोई अन्य स्थान (रजिस्ट्री ???) है जहां COM ऑब्जेक्ट और इंटरऑप के बीच एक लिंक है जिसके लिए आवश्यक है?

उत्तर

6

मुझे लगता है कि मैं माइक्रोसॉफ्ट के Primary Interop Assemblies प्राइमर में अपनी समस्या का जवाब मिल गया। पीआईए दृश्य स्टूडियो में अलग ढंग से नियंत्रित किया जाता है:

एक उपयोगकर्ता है कि एक पंजीकृत पिया है एक प्रकार लायब्रेरी के लिए एक संदर्भ जोड़ने के लिए प्रयास करता है, दृश्य स्टूडियो चुपचाप पंजीकृत पिया बजाय tlbimp साथ प्रकार लायब्रेरी reimporting के प्रयोग करेंगे। यह सुनिश्चित करता है कि जब भी संभव हो पीआईए का उपयोग किया जाता है।

इसका मतलब यह है कि जब आप परियोजना में अपने स्वयं के आईए का संदर्भ जोड़ते हैं, तो विजुअल स्टूडियो यह जांच करेगा कि इस COM ऑब्जेक्ट के लिए कोई पीआईए पंजीकृत है या नहीं। आउटलुक पीआईए कुंजी निम्नलिखित के तहत पंजीकृत किया गया है:

HKEY_CLASSES_ROOT\CLSID\{0006F023-0000-0000-C000-000000000046}\InprocServer32\12.0.0.0 
    Assembly="Microsoft.Office.Interop.Outlook, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" 

क्या मैं regasm उपकरण का उपयोग कुंजी निकालें और पुनः जोड़ने अपनी खुद आइए के संदर्भ में अपेक्षित परिणाम देना चाहिए चाहिए पिया पंजीकरण रद्द समझ में से।

हालांकि, माइक्रोसॉफ्ट एक पीआईए उपलब्ध होने पर कस्टम आईएएस का उपयोग करने की सिफारिश नहीं करता है। मैं इसके लिए सही कारण नहीं समझता, लेकिन मुझे लगता है कि यह मार्शल ऑप्टिमाइज़ेशन से संबंधित हो सकता है और इसमें अद्वितीय प्रकार की परिभाषाएं हो सकती हैं।

+0

धन्यवाद divo। उत्तर के साथ एक समस्या - जैसा कि मैंने सवाल में रखा है, मेरे इंटरऑप असेंबली मजबूत नाम हैं, इसलिए यह अभी भी मेरी समस्या का समाधान नहीं करता है। –

+0

क्षमा करें, मुझे मजबूत नामकरण की बात याद आई, लेकिन मैंने अपना जवाब संशोधित किया। –

+0

ठीक है, लेकिन कैसे आता है, कि मुझे अपने संकलित कोड में इन पीआईए के संदर्भ नहीं दिख रहे हैं? जैसा कि मैंने कहा, मैंने परावर्तक के साथ जांच की, और कोई संदर्भ नहीं है। –

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