2011-06-08 17 views
5

मैं (ऐड-इन एक कॉम एक .NET के लिए शिम) एक Excel 2003 ऐड-इन से CLR का दृष्टांत के लिए निम्न अप्रबंधित सी ++ कोड का उपयोग कर रहा:.NET CLR के संस्करण को नियंत्रित करता है जो CorBindToRuntimeEx द्वारा लोड हो जाता है?

hr = CorBindToRuntimeEx(
     0, // version, use default 
     0, // flavor, use default 
     0, // domain-neutral"ness" and gc settings 
     CLSID_CorRuntimeHost, 
     IID_ICorRuntimeHost, 
     (PVOID*) &m_pHost); 

और मशीनों के विशाल बहुमत के लिए हमारे संगठन में (कुछ सौ) यह पूरी तरह से काम करता है, यहां तक ​​कि कई सीएलआर संस्करणों के साथ भी स्थापित; हालांकि कुछ मशीनों के लिए सीएलआर का गलत (पुराना) संस्करण तत्काल है जो तब असेंबली लोड करने में विफल रहता है क्योंकि इसे .NET 2 रनटाइम की आवश्यकता होती है। पहली बार मैं प्रोसेस एक्सप्लोरर भाग गया और यह काफी समस्या मशीनों में से एक पर निम्नलिखित दिखा खुलासा था के लिए

कल:

process  pid type Handle or DLL 
-------  --- ---- ------------- 
procexp.exe 5056 DLL c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorworks.dll 
EXCEL.EXE 7180 DLL c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorworks.dll 

यानी एक्सेल भी कोई नया हालांकि क्रम के गलत संस्करण के लोड होते ही उपलब्ध है। अब मुझे पता लगाना क्यों है।

कुछ संभावनाओं जो मन में आते हैं:

  1. वहाँ विशिष्ट मशीन पर CLR इन्स्टेन्शियशन की 'प्राथमिकता' के साथ कुछ अजीब है, यहां तक ​​कि एमएस डॉक्स (हालांकि http://msdn.microsoft.com /en-us/library/ms231419.aspx) यह इंगित करने के लिए प्रतीत होता है कि जब तक आप एक विशिष्ट संस्करण का अनुरोध नहीं करते हैं तब तक आप हमेशा नवीनतम प्राप्त करेंगे।
  2. एक्सेल में एक और ऐड-इन पहले ही (जानबूझकर) एक .NET 1 सीएलआर को तुरंत चालू कर चुका है और एक्सेल एक से अधिक होस्ट नहीं कर सकता है।

मुझे इनमें से दूसरे में दृढ़ता से संदेह है, लेकिन यह नहीं पता कि इसे कैसे साबित/ठीक किया जाए।

क्या किसी ने भी इसी तरह के व्यवहार को देखा है? क्या हो रहा है पर कोई सुझाव?

कुछ अन्य नोट्स:

  • सभी वर्कस्टेशन Windows XP SP3 चला रहे हैं
  • एक्सेल 2003 SP3 हमारे संगठन में Excel के केवल संस्करण

मैं दोनों में से किसी को नहीं बदल सकते है ये तो एक नया एक्सेल संस्करण एक विकल्प नहीं है।

+1

ऐसा लगता है कि यह समस्या हो सकती है: http://support.microsoft.com/kb/948461 तो शायद प्रश्न में मशीन VSTO का पुराना संस्करण है। मैं यह स्थापित करने की कोशिश करूंगा कि यह समस्या है या नहीं। –

+0

यह पता चला है कि मशीन * सही * VSTO स्थापित है, इसलिए समस्या नहीं है। इसलिए यह तेजी से लगता है कि यह उस क्रम में है जिसमें एक्सेल एड-इन्स को तुरंत चालू करता है, यानी कुछ पहले लोड किए गए ऐड-इन v1 CLR अनुरोध करते हैं। –

उत्तर

3

इस कुख्यात CLR संस्करण इंजेक्शन समस्या है। जब आप .NET में एक खोल एक्सटेंशन लिखते हैं तो आपको वास्तव में गंदा तरह का सामना करना पड़ता है।

समस्या यह है कि आपके सामने लोड किया गया एक ऐड-इन था और उसने सीएलआर के 1.1 संस्करण को लोड करने के लिए कहा था।यही वह जगह है जहां हिरन बंद हो जाता है, एक प्रक्रिया में सीएलआर का केवल एक संस्करण हो सकता है। आप 2.0.50727 संस्करण को अपने CorBindToRuntimeEx() कॉल में लोड करने के लिए कह सकते हैं, यही वह है जिसे आपको अपने ऐड-इन के लिए आवश्यक है। लेकिन वह असफल हो जाएगा। डिफ़ॉल्ट संस्करण के लिए पूछना सफल होगा लेकिन अब आपका ऐड-इन लोड होने में विफल रहेगा।

'कुछ हल्का' कोण यह है कि आप उस क्रम को तकनीकी रूप से बदल सकते हैं जिसमें ऐड-इन्स लोड हो जाते हैं, यह सुनिश्चित करना कि सीएलआर 2.0 पहले लोड हो जाए। वास्तव में यह सुनिश्चित नहीं है कि यह कैसे करें। ऐड-इन जिसके लिए 1.1 की आवश्यकता है, अभी भी सही तरीके से काम करने की उचित बाधाएं हैं। Superuser.com से पूछें कि क्या आप यही करना चाहते हैं।

एक दीर्घकालिक समाधान है, सीएलआर संस्करण 4 सीएलआर के साइड-बाय-साइड संस्करण में प्रक्रिया का समर्थन करता है। कुछ ऐसा नहीं है जो आपको अभी मदद करेगा।

3

क्या आप सीएलआर पहले ही लोड हो चुके हैं या नहीं, यह जांचने के लिए GetCORVersion का उपयोग कर सकते हैं? और यदि GetCORVersion लोड किए गए सीएलआर संस्करण के रूप में v1.x लौटाता है, तो सीएलआर लोड करना बंद करें और उपयोगकर्ता को एक त्रुटि संदेश प्रस्तुत करें।

आपके एड-इन को .NET v4 में माइग्रेट कर रहा है? v4 सीएलआर ((v1.x या V2) और V4 और नए) की साइड-बाय-साइड होस्टिंग में प्रक्रिया का समर्थन करता है। CLRCreateInstance देखें।

संदर्भ:
CLR Hosting Overview
In-Process Side-by-Side @ MSDN Magazine

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