मेटाडेटा (सीएलआई)

सामान्य भाषा अवसंरचना (CLI) में मेटा डेटा, सामान्य मध्यवर्ती भाषा (CIL) कोड के भीतर एम्बेडेड कुछ डेटा संरचनाओं को संदर्भित करता है जो कोड की उच्च-स्तरीय संरचना का वर्णन करता है। मेटाडेटा असेंबली में परिभाषित सभी कक्षा (कंप्यूटर विज्ञान) और क्लास सदस्यों का वर्णन करता है, और क्लासेस और क्लास विधि (कंप्यूटर विज्ञान) जिसे वर्तमान असेंबली किसी अन्य असेंबली से कॉल करेगी। किसी विधि के मेटाडेटा में विधि का पूरा विवरण होता है, जिसमें क्लास (और असेंबली जिसमें क्लास होती है), रिटर्न प्रकार और सभी विधि पैरामीटर (कंप्यूटर विज्ञान) शामिल हैं।

सीएलआई भाषाओं के संकलक की एक सूची मेटाडेटा उत्पन्न करेगी और इसे असेंबली (सीएलआई) में कॉमन इंटरमीडिएट लैंग्वेज से स्टोर करेगी। जब रन-टाइम CIL को निष्पादित करता है तो यह सुनिश्चित करने के लिए जाँच करेगा कि कॉल की गई विधि का मेटाडेटा मेटाडेटा के समान है जो कॉलिंग विधि में संग्रहीत है। यह सुनिश्चित करता है कि एक विधि को केवल मापदंडों की सही संख्या और बिल्कुल सही पैरामीटर प्रकारों के साथ ही बुलाया जा सकता है।

विंडोज 8 और विंडोज फोन 8 में मौजूद विंडोज रनटाइम एप्लिकेशन प्लेटफॉर्म, किसी भी समर्थित प्रोग्रामिंग भाषाओं में लिखे गए कोड के लिए घटक-उन्मुख प्रोग्रामिंग इंटरफ़ेस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) का वर्णन करने के लिए सीएलआई मेटाडेटा प्रारूप का उपयोग करता है। सामान्य भाषा रनटाइम के भीतर उपयोग में अंतर यह है कि असेंबली में आमतौर पर कोई CIL निर्देश नहीं होता है।

गुण
डेवलपर विशेषताओं के माध्यम से अपने कोड में मेटाडेटा जोड़ सकते हैं। दो प्रकार की विशेषताएँ हैं, कस्टम और छद्म कस्टम विशेषताएँ, और डेवलपर के लिए इनका एक ही सिंटैक्स # कंप्यूटर विज्ञान है। मेटाडेटा उत्पन्न करने के लिए कोड में विशेषताएँ संकलक के लिए संदेश हैं। CIL में, मेटाडेटा जैसे कि इनहेरिटेंस मॉडिफायर्स, स्कोप मॉडिफायर्स, और लगभग कुछ भी जो opcodes या स्ट्रीम नहीं है, को भी एट्रिब्यूट्स के रूप में संदर्भित किया जाता है।

एक कस्टम विशेषता एक नियमित वर्ग (कंप्यूटिंग) है जो से विरासत में मिलती है  कक्षा। सिंटैक्स के साथ किसी भी विधि, संपत्ति, वर्ग या संपूर्ण असेंबली पर एक कस्टम विशेषता का उपयोग किया जा सकता है:   के रूप में: <वाक्यविन्यास प्रकाश लैंग = csharp> [रिवाज़] [कस्टम(1)] [कस्टम (1, टिप्पणी = हाँ )] 

कस्टम विशेषताओं का उपयोग सीएलआई द्वारा बड़े पैमाने पर किया जाता है। विंडोज संचार ढांचा सेवा अनुबंधों को परिभाषित करने के लिए विशेषताओं का उपयोग करता है, ASP.NET इनका उपयोग वेब सेवाओं के रूप में विधियों को उजागर करने के लिए करता है, LINQ उनका उपयोग अंतर्निहित डेटाबेस स्कीमा में कक्षाओं की मैपिंग को परिभाषित करने के लिए करता है, विजुअल स्टूडियो उन्हें एक साथ समूह की संपत्ति (प्रोग्रामिंग) के लिए उपयोग करता है। ऑब्जेक्ट, क्लास डेवलपर लागू करके ऑब्जेक्ट के वर्ग के लिए श्रेणी को इंगित करता है  कस्टम विशेषता। कस्टम विशेषताओं की व्याख्या एप्लिकेशन कोड द्वारा की जाती है न कि सीएलआर द्वारा। जब संकलक एक कस्टम विशेषता देखता है तो यह कस्टम मेटाडेटा उत्पन्न करेगा जो सीएलआर द्वारा पहचाना नहीं गया है। डेवलपर को मेटाडेटा पढ़ने और उस पर कार्य करने के लिए कोड प्रदान करना होता है। एक उदाहरण के रूप में, उदाहरण में दिखाई गई विशेषता को कोड द्वारा नियंत्रित किया जा सकता है:

<वाक्यविन्यास प्रकाश लैंग = csharp> वर्ग CustomAttribute: विशेषता {  निजी int paramNumber = 0; निजी स्ट्रिंग टिप्पणी =;

सार्वजनिक कस्टम एट्रिब्यूट {} सार्वजनिक कस्टम एट्रिब्यूट (इंट संख्या) { paramNumber = num; }

सार्वजनिक स्ट्रिंग टिप्पणी {     सेट {टिप्पणी = मान; } } } 

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

कभी-कभी इस बात को लेकर अस्पष्टता होती है कि आप किस विशेषता को जोड़ रहे हैं। निम्नलिखित कोड पर विचार करें:

<वाक्यविन्यास प्रकाश लैंग = csharp> [नारंगी] सार्वजनिक int उदाहरण विधि (स्ट्रिंग इनपुट) {   // मेथड बॉडी यहां जाती है } 

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

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

मेटाडेटा स्टोरेज
असेंबली में मेटाडेटा की तालिकाएँ होती हैं। इन सारणियों को CIL विनिर्देश द्वारा वर्णित किया गया है। मेटाडेटा तालिकाओं में शून्य या अधिक प्रविष्टियाँ होंगी और किसी प्रविष्टि की स्थिति उसके सूचकांक को निर्धारित करती है। जब CIL कोड मेटाडेटा का उपयोग करता है तो यह मेटाडेटा टोकन के माध्यम से करता है। यह एक 32-अंश मान है जहां शीर्ष 8 बिट उपयुक्त मेटाडेटा तालिका की पहचान करते हैं, और शेष 24 बिट तालिका में मेटाडेटा की अनुक्रमणिका देते हैं। फ्रेमवर्क सॉफ़्टवेयर विकास किट में एक नमूना होता है जिसे कहा जाता है metainfo जो असेंबली में मेटाडेटा तालिकाओं को सूचीबद्ध करेगा, हालांकि, यह जानकारी किसी डेवलपर के लिए शायद ही कभी उपयोगी होती है। असेंबली में मेटाडेटा को .NET फ्रेमवर्क SDK द्वारा प्रदान किए गए ILDASM टूल का उपयोग करके देखा जा सकता है।

CIL मानक में, मेटाडेटा को ILAsm (असेंबली लैंग्वेज) फॉर्म, स्टोरेज के लिए ऑन-डिस्क प्रतिनिधित्व फॉर्म, और पोर्टेबल निष्पादन योग्य (PE, .exe या .dll) फॉर्मेट की असेंबली में एम्बेड किए गए फॉर्म में परिभाषित किया गया है। पीई फॉर्म ऑन-डिस्क फॉर्म पर आधारित है।

प्रतिबिंब
रिफ्लेक्शन सीएलआई मेटाडेटा को पढ़ने के लिए उपयोग किया जाने वाला अप्लिकेशन प्रोग्रामिंग अंतरफलक है। प्रतिबिंब एपीआई मेटाइन्फो जैसे उपकरणों द्वारा प्रदान किए गए शाब्दिक दृश्य के बजाय मेटाडेटा का एक तार्किक दृश्य प्रदान करता है। .NET फ्रेमवर्क के संस्करण 1.1 में प्रतिबिंब का उपयोग कक्षाओं और उनके सदस्यों के विवरण का निरीक्षण करने और विधियों को लागू करने के लिए किया जा सकता है। हालाँकि, यह किसी विधि के लिए CIL तक रनटाइम पहुँच की अनुमति नहीं देता है। ढांचे का संस्करण 2.0 सीआईएल को एक विधि प्राप्त करने की अनुमति देता है।

अन्य मेटाडेटा उपकरण
इसके अतिरिक्त System.Reflection नेमस्पेस, अन्य उपकरण भी उपलब्ध हैं जिनका उपयोग मेटाडेटा को संभालने के लिए किया जा सकता है। Microsoft .NET फ्रेमवर्क एक CLR मेटाडेटा हेरफेर लाइब्रेरी को शिप करता है जिसे देसी कोड में लागू किया गया है। मेटाडेटा को पुनः प्राप्त करने और हेरफेर करने के लिए तृतीय-पक्ष टूल में शामिल हैं PostSharp और /सेसिल मोनो सेसिल का भी उपयोग किया जा सकता है।

यह भी देखें

 * जावा एनोटेशन