2010-03-06 17 views
5

मेरे एएसपी.नेट एमवीसी अनुप्रयोग में, मेरे पास निम्न सेटअप है:जब मैं एक असेंबली लोड करता हूं तो क्या होता है?

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;extras"/> 

मैंने दृश्यों में extras फ़ोल्डर में स्थित असेंबली का संदर्भ दिया है और उन्होंने पूरी तरह से काम किया है (<%@ Import Namespace="myNameSpace" %> का उपयोग करके)।

मेरे प्रश्न

  1. क्या होता है जब उस रेखा को बुलाया जाता है?
  2. असेंबली कहाँ लोड हो जाती है?
  3. ऐसा क्यों है कि मैं extras फ़ोल्डर में स्थित असेंबली को ओवरराइट नहीं कर सकता जिसमें myNameSpace एक नए संस्करण के साथ है? (मुझे एक त्रुटि मिल रही है कि असेंबली किसी अन्य प्रोग्राम में "खुली" है)
  4. क्या एप्लिकेशन को पुनरारंभ किए बिना एक नए संस्करण के साथ असेंबली को ओवरराइट करने का कोई तरीका है?

उत्तर

5

1) आयात वास्तव में कार्यावधि में कुछ भी नहीं है। यह एक संकलन-समय सुविधा है जो आपको सिस्टम के बजाय पर्यावरण के रूप में उनके अयोग्य नामों का उपयोग करके प्रकारों को संदर्भित करने देती है। पर्यावरण।

2) विधानसभा सामान्य विधानसभा की जांच कर नियमों का उपयोग कर भरी हुई है। CLR विभिन्न स्थानों इन निजी जांच रास्तों से पहले की जाँच करता है, तो यह बात का ध्यान रखना में महत्वपूर्ण है। यदि आप एक मजबूत नामित असेंबली का संदर्भ देते हैं और उस असेंबली को एक निजी जांच पथ में ढूंढने की उम्मीद करते हैं, तो जीएसी में एक ही मजबूत नाम (नाम, संस्करण, सार्वजनिक कुंजी, आदि) वाली एक असेंबली को प्राथमिकता दी जाएगी। यह कभी-कभी अप्रत्याशित व्यवहार का कारण बन सकता है और आमतौर पर आपके AssemblyInfo.cs में एक असेंबली संस्करण हार्ड कोडिंग और इसे अपडेट करने के लिए भूल जाता है।

3) एक बार भरी हुई, एक विधानसभा AppDomain उतारने के बिना उतार दिया नहीं जा सकता है। लेकिन एएसपी.नेट "छाया प्रतिलिपि" का उपयोग करता है जिसका अर्थ है कि लोड होने से पहले असेंबली को अस्थायी पथ में कॉपी किया जाता है। इसे मूल असेंबली अनलॉक और ओवरराइट करने में सक्षम होना चाहिए। मेरे सिर के ऊपर से, मुझे यकीन नहीं है कि आपको लॉक असेंबली के बारे में त्रुटि क्यों मिल रही है। एक सामान्य विंडोज़ अनुप्रयोग में, यह पूरी तरह से सामान्य और अपेक्षित होगा। लेकिन एएसपी.नेट डिज़ाइन किया गया है ताकि आप सामग्री चलाते समय सामग्री, कोड, असेंबली इत्यादि को ओवरराइट कर सकें, जिससे # 4 हो जाता है।

4) अभ्यास में, नहीं। चूंकि एक असेंबली को अनलोड नहीं किया जा सकता है, इसलिए वेब एप्लिकेशन को पुनरारंभ किए बिना असेंबली को अपग्रेड करने का कोई तरीका नहीं है। तकनीकी रूप से बोलते हुए, आप एक असेंबली के कई संस्करण लोड कर सकते हैं लेकिन यह आपको वांछित परिणाम नहीं देगा। कोई भी संकलन-समय संदर्भ अभी भी पुरानी असेंबली का संदर्भ देगा और यदि आप नई असेंबली का उपयोग करने का प्रयास करते हैं तो आपको सभी प्रकार के अमान्य कास्ट अपवाद मिलेंगे। लेकिन जैसा कि मैंने एएसपी के साथ # 3 में कहा था।एनईटी उन्नयन असेंबली फ़ाइलों को बदलने के रूप में सरल होना चाहिए और स्वचालित रूप से होना चाहिए। आपको आईआईएस या कार्यकर्ता प्रक्रियाओं को मैन्युअल रूप से पुनरारंभ करने की आवश्यकता नहीं है।

निम्नलिखित लिंक रुचि का हो सकता है।

How the Runtime Locates Assemblies
Best Practices for Loading Assemblies
Shadow Copying Assemblies
Unloading Assemblies - Suzanne Cook

अद्यतन छाया नकल पर थोड़ा अधिक पढ़ने के बाद, मुझे लगता है कि कारण आप एक्स्ट्रा कलाकार फ़ोल्डर में बंद कर दिया विधानसभाओं के मुद्दे दिखाई दे सकती है कि एएसपी.नेट शायद shadow copying के लिए "बिन" फ़ोल्डर निर्दिष्ट करता है।

0
  1. मुझे लगता है कि यह सी # में एक का उपयोग कर बयान के रूप में एक ही है, यह मूल रूप से इसका मतलब है कि नाम स्थान की कक्षाओं अब yoru पेज में इस्तेमाल किया जा के लिए उपलब्ध हैं।
  2. विधानसभा, शायद aspnetwp.exe प्रक्रिया
  3. विधानसभा वर्तमान में इस्तेमाल किया जा रहा है, तो आपको यह त्रुटि संदेश मिल जाएगा
  4. पुन: प्रारंभ करना सबसे सुरक्षित तरीका मैं यह कर के बारे में पता है द्वारा स्मृति में लोड किया जाएगा आप कर सकता है एक ही परिणाम प्राप्त करने के लिए निर्भरता इंजेक्शन या देर से बाध्यकारी का उपयोग करें। मुझे आश्चर्य होगा कि एप्लिकेशन चल रहा है, जबकि आप एक असेंबली स्विच क्यों करना चाहते हैं?
+0

# 4: इसे एक अद्यतन संस्करण के साथ बदलें। क्या यह चल रहा है यह संभव है? – Omar

+0

यदि आप एक इंटरफेस के खिलाफ निर्भरता इंजेक्शन और प्रोग्राम का उपयोग करते हैं तो आप इसे आसानी से कर सकते हैं। – Burt

+0

क्या आप विस्तृत कर सकते हैं ?! – Omar

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

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