2012-09-12 35 views
8

manually managing CLR memory के बारे में पूछने के बीच में, मुझे एहसास हुआ कि मुझे बहुत कम पता है।क्या अप्रबंधित सी # कोड आईएल में संकलित है और सीएलआर पर चलता है?

मुझे पता है कि सीएलआर एक प्रबंधित संदर्भ से बाहर निकलने पर स्टैक पर 'कुकी' रखेगा, ताकि कचरा कलेक्टर आपकी मेमोरी स्पेस को टंप नहीं करेगा; हालांकि, मैंने जो कुछ भी पढ़ा है, वह है कि आप सी

में लिखी गई कुछ लाइब्रेरी को कॉल कर रहे हैं। मैं कम से कम डेटा प्रबंधित करने के लिए प्रबंधित संदर्भ के बाहर सी # में अपने आवेदन की पूरी लेखन परत चाहता हूं स्तर। फिर, मैं इस परत को एक प्रबंधित परत से एक्सेस करना चाहता हूं।

इस मामले में, क्या मेरा अप्रबंधित सी # कोड आईएल को संकलित करेगा और सीएलआर पर चलाया जाएगा? यह कैसे काम करता है?

+0

आप सी # में अप्रबंधित कोड लिखने का जिक्र करते हैं। मुझे लगता है कि आप का मतलब है कि यह * सी # से * कॉलिंग * अप्रबंधित कोड * से अलग है। यदि ऐसा है, तो मैं आपके मतलब का एक उदाहरण देखना चाहता हूं। –

+0

ओलेक्सि के उत्तर के आधार पर, जो मैं ढूंढ रहा था वह बस अस्तित्व में नहीं है। इस प्रकार, मैं वास्तव में आपको एक उदाहरण दिखाने में सक्षम नहीं हूं। 'अप्रबंधित सी #' प्रश्न के बारे में एक स्पष्ट उत्तर के लिए – kd8azz

उत्तर

12

मुझे लगता है कि यह प्रश्न में उल्लिखित उसी सी # डेटाबेस प्रोजेक्ट से संबंधित है।

यह तकनीकी रूप से संभव सी/सी ++ या किसी अन्य भाषा में एक संपूर्ण लेखन परतों को लागू करने के लिए है। और यह तकनीकी रूप से संभव है सी # में सब कुछ है। मैं वर्तमान में ऐसे एप्लिकेशन पर काम कर रहा हूं जो कुछ उच्च प्रदर्शन वाले निम्न स्तर की सामग्री और व्यापार तर्क और ऊपरी स्तर प्रबंधन के लिए सी # के लिए अप्रबंधित कोड का उपयोग करता है।

हालांकि, कार्य की जटिलता को को कम करके कम नहीं किया जाएगा। ऐसा करने का सामान्य तरीका है, अनुबंध डिज़ाइन करना है कि दोनों पार्टियां समझ सकें। अनुबंध प्रबंधित भाषा से अवगत कराया जाएगा और प्रबंधित भाषा देशी एप्लिकेशन को कॉल ट्रिगर करेगी। यदि आपने कभी सी #+ से सी ++ विधि को कॉल करने का प्रयास किया है तो आपको विचार मिलेगा ... इसके अलावा अप्रबंधित कोड के लिए प्रत्येक कॉल में काफी महत्वपूर्ण प्रदर्शन ओवरहेड है, जो निम्न स्तर के प्रदर्शन के पूरे विचार को मार सकता है।

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

यदि आप एक बेवकूफ होना चाहते हैं, लेकिन डेटाबेस के पूरी तरह से कार्यान्वित कार्यान्वयन करना चाहते हैं, तो बस सी # का उपयोग करें। इन दो भाषाओं को तब तक न मिलाएं जब तक कि आप जटिलता को पूरी तरह समझ नहीं लेते। रेवेन डीबी देखें - एक दस्तावेज़ आधारित नोएसक्यूएल डेटाबेस जो पूरी तरह से सी # में बनाया गया है।

मेरी अप्रबंधित सी # कोड आईएल के संकलन करेंगे और CLR पर चलाया जाना?

नहीं, के रूप में अप्रबंधित सी # ऐसी कोई बात नहीं है। सी # कोड हमेशा आईएल कोड में संकलित किया जाएगा और सीएलआर द्वारा निष्पादित किया जाएगा। यह प्रबंधित कोड कॉलिंग अप्रबंधित कोड का मामला है। अप्रबंधित कोड कई भाषाओं सी/सी ++/असेंबली इत्यादि में लागू किया जा सकता है, लेकिन सीएलआर को इस कोड में क्या हो रहा है इसके बारे में कोई जानकारी नहीं होगी।

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

कैसे काम करता है?

प्रबंधित कोड अप्रबंधित कोड के साथ interoperate। ऐसा करने के कुछ तरीके हैं:

  • नेट इंटरऑप के माध्यम से कोड के माध्यम से। यह अपेक्षाकृत तेज़ है लेकिन कोड में थोड़ा बदसूरत दिखता है (साथ ही इसे बनाए रखना/परीक्षण करना मुश्किल है) (good article with C#/C/Assembly samples)
  • एक बहुत धीमी दृष्टिकोण, लेकिन अन्य भाषाओं के लिए अधिक खुला: वेब वार्सेस (एसओएपी, डब्ल्यूएस, आरईएसटी और कंपनी), क्यूइंग (जैसे एमएसएमक्यू, एनएस सर्विसबस और अन्य), भी (संभवतः) इंटरप्रोसेस संचार। तो अप्रबंधित प्रक्रिया एक छोर पर बैठती है और एक प्रबंधित अनुप्रयोग दूसरे पर बैठता है।
+1

+1 –

+0

@ oleksii- आपकी टिप्पणी के लिए अपवाद है _C# कोड हमेशा आईएल कोड_ में संकलित किया जाएगा। यदि माइक्रोसॉफ्ट के .NET कार्यान्वयन का उपयोग करते हैं, तो ngen.exe नामक एक उपकरण है जो आईएल कोड को देशी कोड में प्रीकंपाइल करता है, केवल समय-समय पर ओवरहेड से परहेज करता है, आईएल-> देशी कोड संकलन जो पहली बार एक विधि या कार्य होता है कहा जाता है। हालांकि, यह प्रतिकूल हो सकता है क्योंकि ngen.exe को पहले से ही एक निश्चित आर्किटेक्चर को लक्षित करना होगा और जेआईटी कंपाइलर वास्तव में कोड चलाने वाले मंच के लिए उपलब्ध अनुकूलन का उपयोग कर सकता है। चीयर्स! –

+0

@GerardSexton, क्षमा करें मेरी प्रारंभिक टिप्पणी oleksii –

1

मैं जानता हूँ कि यह एक सी # सवाल यह है, लेकिन अगर आप सी ++, C++/CLI के साथ सहज हैं एक विकल्प पर विचार के लायक हो सकता है।

यह आपको अपने सी ++ कोड के भाग को किसी प्रबंधित या अप्रबंधित संदर्भ में चुनिंदा रूप से संकलित करने की अनुमति देता है - हालांकि ध्यान रखें कि सीएलआर प्रकारों के साथ इंटरैक्ट करने वाले कोड को प्रबंधित संदर्भ में चलाना आवश्यक है।

मैं प्रबंधित-संदर्भ से अप्रबंधित-संदर्भ और उपाध्यक्ष से सी ++ कोड के भीतर से संक्रमण की रनटाइम लागत से अवगत नहीं हूं, लेकिन मुझे लगता है कि यह .NET इंटरऑप के माध्यम से मूल विधि को कॉल करने की लागत के समान होना चाहिए सी # से, जो @oleksii पहले से ही इंगित किया गया है, महंगा है। मेरे अनुभव में यह वास्तव में भुगतान किया गया है यदि आपको मूल सी या सी ++ पुस्तकालयों के साथ अक्सर बातचीत करने की आवश्यकता है - आईएमएचओ सी #+/सीएलआई प्रोजेक्ट के भीतर उन्हें सी #+/सीएलआई प्रोजेक्ट के भीतर से कॉल करना बहुत आसान है, सी # में आवश्यक इंटरनेट इंटरफेस लिखने के बजाय।

यह question देखें कि यह कैसे किया जाता है इस बारे में जानकारी के बारे में जानकारी के लिए।