अनुप्रयोग चालू होने पर .dll फ़ाइलों को प्रतिस्थापित करना?


18

मेरे पास कई गेम सर्वर हैं जो चलाने के लिए एक निश्चित .dll फ़ाइल का उपयोग करते हैं। कभी-कभी मुझे गेम सर्वर को अपडेट करने की आवश्यकता होती है, लेकिन मैं उन गेम को बाधित नहीं करना चाहता जो पहले से चल रहे हैं।

क्या .dll फ़ाइल (यह विंडोज़ द्वारा लॉक की गई है) को बदलने का एक तरीका है, इसलिए गेम सर्वर के अगले इंस्टेंस उस फ़ाइल का उपयोग करते हैं जो नया संस्करण खोलते हैं, और पुराने लोग उस .dll के पुराने संस्करण का उपयोग तब तक करते रहते हैं जब तक कि वे पुनः आरंभ नहीं हो जाते। ?

क्या यह उन उपकरणों में से एक का उपयोग करके फ़ाइल को अनलॉक करना सुरक्षित है जो ऐसा करते हैं और इसे प्रतिस्थापित करते हैं?


शायद आपका खेल नहीं। हालाँकि Chrome आपकी प्रक्रिया को बाधित किए बिना अपडेट करता है। दुर्भाग्य से, यह अनुप्रयोग-विशिष्ट है। (पर जाएं %LocalAppData%\Google\Chrome\Applicationऔर आपको उन फ़ोल्डरों को देखना चाहिए 26.0.1410.64जो अलग-अलग संस्करणों के DLL स्टोर करते हैं)
एल्विन वोंग

प्रश्न में सॉफ़्टवेयर के आधार पर, दो या दो से अधिक अलग-अलग इंस्टेंस को स्थापित करना और चलाना संभव हो सकता है (विभिन्न स्थानों में)। अक्षम, लेकिन शायद व्यावहारिक।
हैरी जॉन्सन

जवाबों:


23

वास्तव में, आप कर सकते हैं और यह आमतौर पर किसी भी मुद्दे के बिना काम करता है (हालांकि हमेशा नहीं)

आप जो भी करते हैं वह फ़ाइल को बिना हिलाए उसका नाम बदल देता है और नई फ़ाइल को उसके ऊपर ले जाता है। यह फ़ाइल के हैंडल को मान्य और कार्यशील रखेगा ताकि पहले से मौजूद इंस्टेंसेस अभी भी फ़ाइल को ठीक से एक्सेस कर सकें और नए इंस्टेंस (या नए हैंडल) wil नई फ़ाइल पर जाएँ।

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


11

नहीं, भले ही एक DLL पूरी तरह से भौतिक मेमोरी में मैप किया जा सकता है, जबकि अनुप्रयोग चलता है, निश्चित रूप से इसकी कोई गारंटी नहीं है। DLL (और यहां तक ​​कि निष्पादन योग्य) के भाग को रैम में मैप किया जा सकता है, जबकि इसके अन्य बिट्स डिस्क पर रहते हैं, और बाद के समय में पढ़े जा सकते हैं।

फ़ाइल को डिस्क पर बदलते समय जबकि Windows में बिट्स रैम में मैप किया गया होता है वह अच्छी तरह से समाप्त नहीं होता है। विंडोज एक अच्छे कारण के लिए इसे लॉक करता है।

संपादित करें: मुझे कुछ स्पष्ट करने की आवश्यकता है क्योंकि कुछ लोग विंडोज को दोष देने के इरादे से लगते हैं कि वास्तव में एक एप्लीकेशन डिजाइन मुद्दा है, न कि ओएस डिजाइन मुद्दा।

आप DLL को अपडेट कर सकते हैं जो अनुप्रयोग प्रक्रिया को समाप्त किए बिना विंडोज में उपयोग करते हैं, लेकिन एप्लिकेशन को इस तरह से लिखा जाना चाहिए कि यह असेंबली को अनलोड करने के लिए संकेत दिया जा सकता है, अपडेट समाप्त होने की प्रतीक्षा करें, फिर DLL को पुनः लोड करें। इससे आपके द्वारा चलाए जा रहे OS से कोई लेना-देना नहीं है। यह एक एप्लिकेशन डिज़ाइन समस्या है।

संपादित करें: यह भी संभव समाधान के लिए स्टीफन का जवाब देखें कि आपके विशिष्ट अनुप्रयोग इसके डीएलएल बदलने पर कैसे प्रतिक्रिया करते हैं, इस पर काम कर सकते हैं। मुझे लगता है कि वह एक उत्थान के हकदार हैं।


क्या उस फ़ाइल को एक अस्थायी स्थान पर ले जाने का कोई तरीका है ताकि इसे बाद में हटा दिया जा सके, जबकि इसके पुराने स्थान में एक नया डाल दिया जाए (इसलिए इसके बाद शुरू होने वाले सर्वर नए dll का उपयोग करेंगे)? या फ़ाइल हैंडल फ़ाइल स्थान से जुड़ा है?

यह पूरी तरह से इस बात पर निर्भर करता है कि आवेदन कैसे लिखा जाता है / यह DLL का उपयोग कैसे करता है। ग्रेग आस्क के उत्तर पर एक नज़र डालें। यदि फ़ाइल हैंडल खुला है, तो इसके बारे में आप बहुत कुछ नहीं कर सकते। आप फ़ाइल हैंडल को जबरन बंद कर सकते हैं, लेकिन यदि आपका संपूर्ण OS नहीं है, तो आप कम से कम अपने ऐप को लगभग दुर्घटनाग्रस्त कर देंगे।
रायन रीस

तो यह "अच्छा कारण" क्या है? अब तक आपके जवाब में सम्मोहक कारण नहीं है कि Microsoft हॉट-स्वैपिंग की क्षमता क्यों प्रस्तुत नहीं करता है।
कोनराड रूडोल्फ

2

नहीं, आपको मौजूदा फ़ाइल हैंडल के साथ टिंकर नहीं करना चाहिए।

यदि आप असेंबली के लोडिंग का नियंत्रण ले सकते हैं, और निर्दिष्ट करें कि यह FileShare.Delete के साथ खोला गया है, तो इसे फिर से चालू करना संभव है। मौजूदा प्रक्रियाओं का नाम बदलकर विधानसभा रखा जाएगा।

/programming/7147577/programmatically-rename-open-file-on-windows


2
मेरे अनुभव में, ज्यादातर मामलों में (अच्छी तरह से, आधे से अधिक समय, किसी भी दर पर) आप आवेदन के साथ किसी भी छेड़छाड़ के बिना एक DLL का नाम बदल सकते हैं (लेकिन हटा नहीं सकते हैं)।
हैरी जॉन्सन

@HarryJohnston: हाँ, ऐसा लगता है कि मैं इसका नाम बदल सकता हूँ। भले ही यह उपयोग में हो। मुझे लगता है कि मैं अभी से ऐसा करूँगा।

1

नहीं, दुर्भाग्य से यह संभव नहीं है।

क्षमा करें, जब तक कि देर से बाध्यकारी न हो, सटीक होना चाहिए, जिसका अर्थ है कि एप्लिकेशन उस dll का उपयोग करता है जब उस dll में कोड का कुछ भाग चलता है, लेकिन यह अभी भी विश्वसनीय नहीं है।


1

आप देख सकते हैं कि asp.net होस्ट की गई प्रक्रिया कैसे काम करती है और कुछ इसी तरह का विकास करती है।

यह पूरे वेब एप्लिकेशन को लेता है और इसे एक अस्थायी स्थान पर ले जाता है, जहां से एप्लिकेशन वास्तव में लोड होता है। तब यह मूल फ़ोल्डर में परिवर्तनों के लिए निगरानी करने के लिए एक प्रक्रिया छोड़ देता है, जब पता लगाया जाता है, तो यह एक नए अस्थायी स्थान में एप्लिकेशन के एक नए उदाहरण को स्पिन करता है और उस ऐप पर नए अनुरोधों को पुनर्निर्देशित करना शुरू करता है। एक बार लंबित अनुरोध समाप्त होने के बाद पुराना ऐप फाड़ दिया जाता है।

(Nitpicking, हाँ, यह चीजों का एक सरल दृष्टिकोण है, ज्यादातर मामलों में IIS अनुरोधों को तब तक कतार में लगाता है जब तक कि नया ऐप लेने में सक्षम न हो)


0

लगभग एक दशक पहले, मैं http://www.eggcentric.com/ISAPILoader.htm का एक खुश उपयोगकर्ता था जिसने IIS ISAPI dll स्वैपिंग को लाइव किया था। मिस्टर एग अभी भी अपने FOSS समाधान का समर्थन कर रहे हैं।


0

NSIS इंस्टॉलर के पास Move To Temp on Machine Restart के रूप में एक विकल्प है, OS अगले बूट पर अलग स्थान पर जाने के लिए कुछ फ़ाइल को झंडी देता है, अगली मशीन बूट पर ये ध्वजांकित फाइलें स्वचालित रूप से आपके द्वारा पहले चुने गए नए स्थान पर चली जाती हैं। इस पर थोड़ी खोज आपको इस संबंध में खुश कर देगी।


आप किसी समाधान की खोज करने के लिए ओपी को बताने के बजाय अपने उत्तर में पूर्ण उत्तर प्रदान कर सकते हैं। वह यहाँ नहीं पूछ रहा है कि क्या वह पहले से ही एक समाधान मिल गया है। धन्यवाद।
बजे जॉन उर्फ ​​हॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.