2008-12-09 18 views
10

this article कोड के जेआईटी संकलन के कारण .NET असेंबली के लिए पुन: प्रयास आवश्यक नहीं है। लेख में कहा गया है:.NET असेंबली और डीएलएल

"जेआईटी-संकलित कोड में कोई समस्या नहीं है क्योंकि कोड को स्मृति में रखा गया है, इस पर आधारित समय पर पते उत्पन्न होते हैं। इसके अलावा, एमएसआईएल एमएसआईएल के बाद बेस एड्रेस मिस से शायद ही कभी प्रभावित होता है सन्दर्भ पते के बजाय संदर्भ टोकन-आधारित हैं। इस प्रकार जब जेआईटी कंपाइलर का उपयोग किया जाता है, तो सिस्टम बेस एड्रेस टकराव के लिए लचीला होता है। "

हालांकि, मैंने देखा है कि VS2008 सभी विधानसभाओं के लिए डिफ़ॉल्ट 0x0400000 आधार पते प्रदान करती है (परियोजना गुण> उन्नत निर्माण>) और अगर मैं अपने प्रक्रिया के लिए एक listdlls /r कर मेरे सारे .NET विधानसभाओं डिफ़ॉल्ट प्रति रिबेस वास्तव में कर रहे हैं।

यदि मैं स्वयं को संबोधित करता हूं, तो कोई रिबिंग नहीं किया जाता है।

मेरा सवाल है: इस मामले में क्या छूट है और क्यों?

संपादित करें: मुझे यह जोड़ना चाहिए कि मैं एनजेन असेंबली के बारे में बात नहीं कर रहा हूं।

उत्तर

3

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

+0

मैं समझता हूं कि फिक्स-अप का कोई कारण नहीं है, लेकिन चूंकि हम नेटवर्क ड्राइव से असेंबली लोड कर रहे हैं, इसलिए प्रतिलिपि के पेजफाइल भाग में प्रतिलिपि के कारण रिबेसिंग समस्या हो सकती है। विवरण के साथ किसी भी लिंक की सराहना की जाएगी। धन्यवाद। –

+1

AFAIK, कॉपी-टू-पेजफाइल उन फिक्सअप का सीधा परिणाम है, क्योंकि निष्पादन योग्य कोड वाले पृष्ठ प्रक्रिया के लिए लिखने योग्य/निजी हो जाते हैं, इसलिए ओएस उन्हें सीधे डीएलएल से पुनः लोड नहीं कर सकता है। क्या आपका यह मतलब है? – liggett78

+0

एक पुराना (मध्य आयु से लगता है) लेकिन 13 साल पहले रीबेजिंग (मूल कोड) के बारे में http://msdn.microsoft.com/en-us/library/ms810432.aspx पर अभी भी मूल्यवान लेख है। – liggett78

0

आप किस ओएस चल रहे हैं? मुझे पता है कि विस्टा और उससे आगे एएसएलआर पेश किया गया है जो पता स्थान को यादृच्छिक बनाता है जो इसे डीएलएस में लोड करता है। यह सिस्टम डीएलएस के लिए होता है लेकिन .NET के बारे में निश्चित नहीं है - शायद कुछ देखने के लिए।

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