2009-05-14 10 views
17

मैं एक ऐसी कक्षा बनाना चाहता हूं जो एक एकल डीएलएल में संकलित हो। यह डीएलएल मौजूदा उत्पाद में कार्यक्षमता जोड़ देगा।क्या कक्षा में संस्करण-स्वतंत्र डीएलएल संदर्भ होना संभव है?

इस काम को करने के लिए, कस्टम क्लास अंतर्निहित उत्पाद में डीएलएल का संदर्भ देता है। संकलन के लिए इन संदर्भों की आवश्यकता है।

सबकुछ ठीक काम करता है और कस्टम क्लास संकलित करता है। मैं उत्पाद में उत्पादित डीएलएल छोड़ सकता हूं और सब कुछ ठीक काम करता है।

हालांकि, इस उत्पाद में कई संस्करण हैं (मामूली संस्करण, सर्विस पैक)। मैं इस डीएलएल को दूसरों को वितरित करना चाहता हूं लेकिन मुझे लगता है कि डीएलएल को उत्पाद के संस्करण पूरी तरह से से मेल खाना चाहिए। अगर कोई एक सटीक मिलान नहीं है, तो निम्न त्रुटि होती है:

फ़ाइल या विधानसभा 'Product.Web.UI लोड नहीं कर सका, संस्करण = 3.6.1920.2, संस्कृति = तटस्थ, PublicKeyToken = dfeaee0e3978ac79 'या इसकी निर्भरताओं में से एक। स्थित असेंबली की स्पष्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है। (HRESULT से अपवाद: 0x80131040)

मुझे DLL उस संस्करण संदर्भ बारे में चयन नहीं है कैसे बना सकता हूं?

उत्तर

4

मेरे पास अभी तक मेरे प्रश्न का उत्तर नहीं है, लेकिन मैं समाधान के लिए खोज करते समय मिले ब्रेडक्रंब लॉग करने के लिए इस उत्तर का उपयोग करूंगा।

मैं StackOverflow पर कुछ हद तक एक संबंधित सवाल पाया:

Compile a version agnostic .DLL in .NET (Using Manifests?)

मैं हालांकि अंतर्निहित उत्पाद को संशोधित करने के लिए कोई क्षमता है, तो इसका जवाब मेरे लिए काम नहीं करता।


अपडेट किया गया:

मैं किसी को बहुत होशियार ईमेल कर दी मुझ से और यहाँ जवाब था:

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

हमारे असेंबली के मजबूत नामों को हटाने का विकल्प केवल एक विकल्प नहीं है। मैं विवरण में क्यों नहीं जाऊंगा, लेकिन आप एमएसडीएन में कुछ शोध कर सकते हैं।

तो, आपके द्वारा संदर्भित असेंबली के प्रत्येक संस्करण के खिलाफ कामकाज के निर्माण के लिए आपके पास दो विकल्प हैं।

  1. आप आंशिक संदर्भ कर सकते हैं। यह आलेख देखें: http://msdn.microsoft.com/en-us/library/0a7zy9z5(VS.71).aspx
  2. आप web.config में बाध्यकारी पुनर्निर्देशन के साथ संगत संस्करण घोषित कर सकते हैं। यह आलेख देखें: http://msdn.microsoft.com/en-us/library/433ysdt1.aspx। 1. आप वैश्विक विधानसभा कैश में विधानसभाओं के लिए आंशिक संदर्भ का उपयोग नहीं कर सकते हैं, अपने नियंत्रण जिसका अर्थ है यदि विधानसभाओं GAC में हैं एक ही अपवाद फेंक देगा:

सामान्य तौर पर, क्योंकि दूसरा दृष्टिकोण की सिफारिश की है। 2. आप स्पष्ट रूप से संगत संस्करण बताते हैं।

-1

विजुअलस्टूडियो में - क्या आपने संदर्भित असेंबली (डीएलएल) पर राइट क्लिक करने का प्रयास किया है और फिर चयनित गुणों को सेट किया है और "विशिष्ट संस्करण की आवश्यकता है" (या तो) अभी तक? इससे आपकी समस्या हल हो सकती है।

एंड्रियास

+1

हाँ, इसे आजमाया। मेरी समझ यह है कि यह सेटिंग केवल संकलन-समय पर लागू होती है। मतलब, कंपाइलर बनाने के दौरान यह डीएलएल के संस्करण के बारे में पसंद नहीं है। हालांकि, परिणामस्वरूप डीएलएल के लिए, उन गैर-विशिष्ट डीएलएल संदर्भों को डीएलएल के आधार पर दृढ़ता से नामित असेंबली संदर्भ (संस्करण संख्या के साथ पूर्ण) में परिवर्तित किया जाएगा जिसका उपयोग संकलन के लिए किया गया था। –

7

यह एक उत्कृष्ट समाधान है। यह मेरे लिए एक समान समस्या हल हो गया।

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; 
     } 
    } 
} 
संबंधित मुद्दे