असेंबली बाइंडिंग रीडायरेक्ट: कैसे और क्यों?


127

यह समस्या का प्रश्न नहीं है, बल्कि असेंबली बाइंडिंग रीडायरेक्ट के कार्य पर एक सामान्य समझ वाला प्रश्न है।

प्रश्नों

  1. क्यों बाध्यकारी पुनर्निर्देशन केवल प्रमुख संस्करण दिखाता है और नाबालिग, बिल्ड और संशोधन संख्या नहीं?
  2. क्या पुराने और नए संस्करण केवल तभी बदलते हैं जब प्रमुख संस्करण में परिवर्तन होता है?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

यह कोई भी संस्करण हो सकता है, न कि केवल प्रमुख। उदाहरण के लिए:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: मेरे द्वारा देखे गए सभी उदाहरण केवल प्रमुख संस्करण दिखाते हैं।
निखिल अग्रवाल

4
वैसे वे केवल उदाहरण हैं, और यह कहीं नहीं कहा गया है कि यह एकमात्र तरीका संभव है।
Evk

जवाबों:


166

बाध्यकारी पुनर्निर्देशन की आवश्यकता क्यों है? मान लीजिए कि आपके पास A, लायब्रेरी B का संदर्भ देता है, और संस्करण 1.1.2.5 का लाइब्रेरी C भी है। लाइब्रेरी बी बदले में लाइब्रेरी सी का भी संदर्भ देता है, लेकिन संस्करण 1.1.1.0 का। अब हमारे पास एक संघर्ष है, क्योंकि आप एक ही असेंबली के विभिन्न संस्करणों को रनटाइम पर लोड नहीं कर सकते। इस विरोध को हल करने के लिए, आप आमतौर पर नए संस्करण में बाइंडिंग पुनर्निर्देशन का उपयोग कर सकते हैं (लेकिन पुराने के लिए भी हो सकता है)। आप आवेदन ए के निम्नलिखित फ़ाइल को जोड़कर ऐसा करते हैं, configuration > runtime > assemblyBindingअनुभाग के तहत ( पूर्ण विन्यास फ़ाइल के उदाहरण के लिए यहां देखें ):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

आप नक्शे में कई प्रकार के संस्करण भी निर्दिष्ट कर सकते हैं:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

अब लाइब्रेरी बी, जिसे संस्करण 1.1.1.0 के C के संदर्भ में संकलित किया गया था, रनटाइम पर C संस्करण 1.1.2.5 का उपयोग करेगा। बेशक, आप बेहतर सुनिश्चित करते हैं कि लाइब्रेरी सी बैकवर्ड संगत है या इससे अप्रत्याशित परिणाम हो सकते हैं।

आप पुस्तकालयों के किसी भी संस्करण को पुनर्निर्देशित कर सकते हैं, न कि केवल प्रमुख।


किस फ़ाइल और किस सेक्शन के तहत जाना है? क्या कोई कृपया संदर्भ के लिए MSDN या इसी तरह के स्रोत का लिंक प्रदान कर सकता है? याद रखें कि लोग आपके एसओ क्यू / ए पर खोज इंजन गोले के सभी लेखों और संदर्भों से महत्वपूर्ण होंगे। मेरे पास एक सहकर्मी था जो मुझे बताता है कि "एक सप्ताह के लिए छुट्टी पर जाने से ठीक पहले" आपके विधानसभा फ़ाइल में पुनर्निर्देशन जोड़ें "और मैं यहां उतरा और जबकि यह उत्तर बहुत अच्छा लग रहा है, इसमें संदर्भ और संदर्भ का अभाव है।
तपती

वैध सवाल @tpartee, मैं इस सवाल का जवाब (समकक्ष समीक्षा का इंतजार कर) संपादित कर लिया config अनुभाग और के लिए एक लिंक शामिल करने के लिए docs.microsoft.com/en-us/dotnet/framework/configure-apps/...
Kobus स्मिट

1
@ AlexanderDerck ए एप्लिकेशन की कॉन्फिग फ़ाइल में - पुस्तकालयों की कॉन्फिग फाइलों में इनका कोई प्रभाव (जहाँ तक मुझे पता है) पर कोई असर नहीं पड़ता है, सिवाय तब जब यह लाइब्रेरी यूनिट टेस्ट लाइब्रेरी है और यूनिट टेस्ट रनर द्वारा कुछ अर्थों में "निष्पादित" है।
Evk

1
@AlexanderDerck कुछ हफ़्ते पहले एक सवाल था, कई अपवोट्स और यहां तक ​​कि इनाम के साथ, जो बिल्कुल पूछ रहा था, लेकिन कोई भी ठोस जवाब देने में सक्षम नहीं था - stackoverflow.com/q/48377474-5311735
Evk

1
@CodeEngine publicKeyToken असेंबली सी की पहचान करता है। केवल हस्ताक्षरित असेंबली में सार्वजनिक कुंजी टोकन की पहचान होती है। यहाँ एक संबंधित प्रश्न है कि आप कैसे पता लगा सकते हैं कि दिए गए टोकन से आपके पास विधानसभा है: stackoverflow.com/q/3045033/5311735
Evk

56

हम न्यूटन सॉफ्ट के लिए बाइंडिंग पुनर्निर्देशन के साथ एक मुद्दे पर आए थे। जेसन। हमने फ़ाइल संस्करण को जीत के 10 फ़ाइल गुणों "9.0.1.19813" में देखा, संख्या को देखा और पुनर्निर्देशन विफल रहा। आगे की जांच और पाया गया कि हम फाइल संस्करण देख रहे थे न कि विधानसभा संस्करण। इसलिए, मुझे आश्चर्य है कि यदि लोग फ़ाइल संस्करण (जो अक्सर बदलते हैं) और असेंबली संस्करण (जिसे आप विंडोज़ 10 फ़ाइल एक्सप्लोरर में नहीं देख सकते हैं) को गलत समझ रहे हैं। एक dll के असेंबली संस्करण को देखने के लिए आप इसे पावरशेल में चला सकते हैं। उस dll नाम को उस व्यक्ति से बदलें जिसे आप संस्करण खोजना चाहते हैं।

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

ऊपर का परिणाम है।

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

देखें संदर्भ:

मैं Windows Vista और .NET में असेंबली के असेंबली संस्करण को कैसे देख सकता हूं और नए (वंडोज़ 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

यहाँ छवि विवरण दर्ज करें


12
फ़ाइल संस्करण और असेंबली संस्करण के बीच अंतर लाने के लिए अद्यतन !!
mrid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.