2013-08-20 15 views
9

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

+1

इसे ओएसएक्स के लिए मिला: http://stackoverflow.com/questions/11821955/load- गतिशील- पुस्तकालय-from- स्मृति और यह विंडोज़ के लिए: http://stackoverflow.com/questions/638277/loading-dll- एक-स्थान-इन-मेमोरी – koopajah

+0

मुझे विंडोज और लिनक्स के लिए समाधान की आवश्यकता है। –

उत्तर

4

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

लिनक्स एक बहुत ही समान तरीके से काम करता है (मुझे पता है कि यह डिफ़ॉल्ट रूप से उसी तरह की मांग-लोडिंग का उपयोग करता है, लेकिन यह सुनिश्चित नहीं है कि इसके आसपास कोई रास्ता है या नहीं), इसलिए मुझे विश्वास नहीं है कि वहां कोई अन्य तरीका है या तो, लेकिन मैंने गहराई से इसे नहीं देखा है।

बेशक, यदि आप चाहते हैं कि कोड का एक टुकड़ा है जिसे आप अपने आवेदन में उपयोग कर सकते हैं, और आप इसे अपनी एक्सेक्टेबल फ़ाइल में एन्क्रिप्टेड/संपीड़ित/जो कुछ भी कर सकते हैं, उसे स्टोर करना चाहते हैं, तो आप कुछ निष्पादन योग्य मेमोरी आवंटित कर सकते हैं (विंडोज़ में, आप निष्पादन योग्य स्मृति आवंटित करने के लिए VirtualAlloc का उपयोग कर सकते हैं)। हालांकि, आपको यह सुनिश्चित करने की ज़रूरत है कि यदि आप ऐसा करते हैं तो आप अपने कोड में किसी भी पूर्ण मेमोरी पते को स्थानांतरित करते हैं, इसलिए आपको अपने निष्पादन योग्य में स्थानान्तरण जानकारी संग्रहीत करने की आवश्यकता होगी।

स्पष्ट रूप से, आसान समाधान फाइल सिस्टम में फ़ाइल में अपनी सामग्री को अनपैक करना है, और वहां से लोड करना है।

+0

रैमडिस्क की तुलना में एक तर्कसंगत बेहतर समाधान के लिए https://github.com/fancycode/MemoryModule देखें (यदि कोई "अच्छा" या "बेहतर" समाधान है, तो मुझे नहीं लगता कि शुरुआत से प्रयास करना एक अच्छा विचार है)। – Damon

+0

@ डैमन: मैं जो तीसरा अनुच्छेद में वर्णन करता हूं, वह मैं कर रहा हूं (मुझे विस्तार से सभी कोडों के माध्यम से नहीं मिला)। –

+0

@ मैट्स पीटरसन: हाँ, यह वही है जो यह करता है। यह एक कामकाजी कार्यान्वयन है (मैंने इसे कुछ साल पहले कोशिश की थी) और ओपी चाहता है कि "रैमडिस्क" दृष्टिकोण से थोड़ा बेहतर है (क्योंकि आप किसी भी तरह से रैमडिस्क से गैर-एन्क्रिप्टेड फ़ाइल पढ़ सकते हैं)। हालांकि, मुझे अभी भी उस सामान के साथ छेड़छाड़ करने का अच्छा विचार नहीं माना जाता है, क्योंकि यह गंभीर रूप से वीएम प्रबंधन में हस्तक्षेप करता है और यह कुछ हद तक साझा लाइब्रेरी की अवधारणा के विपरीत भी है। डीएलएल फ़ाइल आधारित होने का मुद्दा यह है कि आप एक ही पेज को कई प्रक्रियाओं में मैप कर सकते हैं, उन्हें फेंक सकते हैं, और मांग पर पुनः लोड कर सकते हैं। वास्तव में – Damon

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

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