में क्लास लोडर के बराबर है क्या किसी को पता है कि .NET में "जावा कस्टम क्लास लोडर" के समतुल्य को परिभाषित करना संभव है?.NET
मुझे लगता है कि CLR, "लिबर्टी" कहा जाता है को लक्षित करता है एक नई प्रोग्रामिंग भाषा विकसित करने की प्रक्रिया में हूँ:
एक छोटे पृष्ठभूमि देने के लिए। भाषा की विशेषताओं में से एक है "टाइप कन्स्ट्रक्टर" को परिभाषित करने की इसकी क्षमता, जो संकलन समय पर संकलक द्वारा निष्पादित विधियों और आउटपुट के रूप में प्रकार उत्पन्न करती हैं। वे (वाक्य रचना "लिबर्टी" में) जेनरिक के सामान्यीकरण की तरह (भाषा उस में सामान्य जेनरिक है), और इस तरह कोड लिखने की अनुमति देने हैं:
var t as tuple<i as int, j as int, k as int>;
t.i = 2;
t.j = 4;
t.k = 5;
कहाँ "टपल" इतनी तरह परिभाषित किया गया है :
public type tuple(params variables as VariableDeclaration[]) as TypeDeclaration
{
//...
}
इस विशिष्ट उदाहरण में, निर्माता tuple
में वीबी और सी # गुमनाम प्रकार के लिए कुछ इसी तरह प्रदान करता है।
हालांकि, अज्ञात प्रकारों के विपरीत, "tuples" के नाम हैं और सार्वजनिक विधि हस्ताक्षर के अंदर उपयोग किया जा सकता है।
इसका मतलब है कि मुझे उस प्रकार के लिए एक तरीका चाहिए जो अंततः कंपाइलर द्वारा कई असेंबली में साझा करने के लिए उत्सर्जित हो जाता है। उदाहरण के लिए, मैं
tuple<x as int>
विधानसभा एक में परिभाषित चाहते tuple<x as int>
के रूप में एक ही प्रकार विधानसभा बी
में परिभाषित किया जा रहा है अंत में, ज़ाहिर है, कि विधानसभा एक और विधानसभा बी करने जा रहे हैं अलग-अलग समय पर संकलित किया जाए, जिसका अर्थ है कि वे दोनों टुपल प्रकार के अपने असंगत संस्करणों को उत्सर्जित कर देंगे।
class tuple<T>
{
public Field1 as T;
}
class tuple<T, R>
{
public Field2 as T;
public Field2 as R;
}
:
मैं "प्रकार विलोपन" के कुछ प्रकार का उपयोग कर तो यह है कि मैं इस तरह प्रकार के एक समूह के साथ एक साझा पुस्तकालय (यह "लिबर्टी" वाक्य रचना) के लिए होता है ऐसा करने के लिए, में देखा और फिर i, j, और k tuple फ़ील्ड से Field1
, Field2
, और Field3
तक पहुंच को पुनर्निर्देशित करें।
हालांकि यह वास्तव में एक व्यवहार्य विकल्प नहीं है। इसका मतलब यह होगा कि संकलन समय tuple<x as int>
और tuple<y as int>
अलग-अलग प्रकार के होते हैं, जबकि रनटाइम समय पर उन्हें एक ही प्रकार के रूप में माना जाएगा। इससे समानता और प्रकार की पहचान जैसी चीजों के लिए कई समस्याएं पैदा होंगी। यह मेरे स्वाद के लिए एक अमूर्तता की बहुत कमजोर है।
अन्य संभावित विकल्प "राज्य बैग ऑब्जेक्ट्स" का उपयोग करना होगा। हालांकि, एक राज्य बैग का उपयोग भाषा में "प्रकार कन्स्ट्रक्टर" के लिए समर्थन रखने के पूरे उद्देश्य को हरा देगा। संकलन समय पर नए प्रकार उत्पन्न करने के लिए "कस्टम भाषा एक्सटेंशन" को सक्षम करने का विचार है कि संकलक स्थिर प्रकार की जांच कर सकता है।
जावा में, यह कस्टम क्लास लोडर का उपयोग करके किया जा सकता है। असल में कोड जो टुपल प्रकारों का उपयोग करता है, वास्तव में डिस्क पर प्रकार को परिभाषित किए बिना उत्सर्जित किया जा सकता है। एक कस्टम "क्लास लोडर" को तब परिभाषित किया जा सकता है जो रनटाइम पर गतिशील रूप से ट्यूपल प्रकार उत्पन्न करेगा। इससे कंपाइलर के अंदर स्थिर प्रकार की जांच की अनुमति मिल जाएगी, और संकलन सीमाओं में ट्यूपल प्रकारों को एकजुट किया जाएगा।
दुर्भाग्य से, हालांकि, सीएलआर कस्टम क्लास लोडिंग के लिए समर्थन प्रदान नहीं करता है।सीएलआर में सभी लोडिंग असेंबली स्तर पर की जाती है। प्रत्येक "निर्मित प्रकार" के लिए एक अलग असेंबली को परिभाषित करना संभव होगा, लेकिन यह बहुत ही तेजी से प्रदर्शन समस्याओं का कारण बन जाएगा (उनमें से केवल एक ही प्रकार के साथ कई असेंबली बहुत अधिक संसाधनों का उपयोग करेंगे)।
तो, क्या मैं जानना चाहता हूँ है:
क्या यह संभव है नेट, जावा में क्लास लोडर की तरह कुछ है, जहां मैं में, गैर-मौजूद प्रकार के लिए एक संदर्भ का उत्सर्जन कर सकते हैं अनुकरण करने के लिए और फिर जनरेट कोड के उपयोग से पहले रनटाइम पर उस प्रकार का संदर्भ चलता है?
नोट:
* मैं वास्तव में पहले से ही सवाल है, जो मैं नीचे एक जवाब के रूप प्रदान करने के लिए उत्तर जानते हैं। हालांकि, मुझे समाधान के साथ आने के लिए लगभग 3 दिन का शोध हुआ, और आईएल हैकिंग का थोड़ा सा हिस्सा लिया। मुझे लगा कि किसी और को एक ही समस्या में भाग लेने के मामले में इसे दस्तावेज करना एक अच्छा विचार होगा। *
ओह वाह, पहली पोस्ट मैंने कभी सोचा था कि अध्याय शीर्षक होना चाहिए। महान जानकारी! पोस्ट करने का शुक्रिया! –