2010-07-11 21 views
6

से एमएसआईएल उत्पन्न करने के लिए कौन से तरीके मौजूद हैं। मैं .NET प्लेटफार्म के लिए अपनी भाषा का बैकएंड बनाने की कोशिश कर रहा हूं। डेल्फी में लिखे गए फ्रंट एंड एंड दुभाषिया। अप्रबंधित एपीआई सिर्फ टाइप परिभाषाओं की अनुमति देता है लेकिन एमएसआईएल का कोई उत्सर्जन नहीं करता है।अप्रबंधित कोड

क्या तरीके अप्रबंधित कोड से MSIL उत्पन्न करने के लिए मौजूद हैं? प्रतिबिंब का उपयोग किए बिना। इसे प्राप्त करने के लिए इस्लाम का उपयोग करें और उपयोग करें? धन्यवाद।

उत्तर

5

डेल्फी के नेट कोड जनरेटर, सीधे स्मृति में बाईटकोड के रूप में आईएल का उत्सर्जन करता है ज्यादा 86 कोड पीढ़ी की तरह यह है कि उचित हेडर के साथ आदि, कोड जनरेटर सीधे बाइट्स, अपवाद टेबल आदि का उत्सर्जन करता है, इनकोडिंग आईएल प्रारूप करने के लिए इसी । यह एपीआई के साथ ऐसा नहीं करता है, बल्कि पुराने तरीके से: कोड को एक बार में एक बाइट लिखें।

बाद में, डेल्फी के अंतर्निहित लिंकर मेटाडाटा उत्पन्न करने के लिए IMetaDataEmit आदि के साथ काम करता है, और IMetaDataEmit::SetRVA मेटाडाटा जहां कोड निष्पादन में स्थित किया जा रहा है यह बताने के लिए। मेटाडाटा को IMetaDataEmit::SaveToMemory के साथ कॉपी किया गया है और उसके बाद पीई में कॉपी किया गया है कि लिंकर का निर्माण हो रहा है, सीएलआर हेडर मेटाडेटा प्रारंभ को इंगित करने के लिए संगत रूप से पैच किया गया है।

यह बहुत सी कोड है, इसमें से कुछ बहुत ही स्पष्ट हैं, क्योंकि इसमें से अधिकांश डेल्फी के मौजूदा x86 लिंकर के माध्यम से थ्रेड किया गया है, जो शाखा ऑप्टिमाइज़ेशन और अप्रयुक्त कोड (स्मार्ट लिंकिंग) को समाप्त करने जैसी चीजें करता है जो सख्ती से बोलना आम तौर पर नहीं है .NET के लिए आवश्यक है।

अगर हम इसे फिर से करना चाहते हैं, तो हम मेटाडेटा बनाने के लिए .NET एपीआई से बहुत अच्छी तरह से बच सकते हैं, और पूरी चीज सीधे spec से उत्पन्न कर सकते हैं। एपीआई ऑप्टिमाइज़ेशन के लिए एक ब्लैक बॉक्स बन गया, और संकलन समय की पर्याप्त मात्रा में जोड़ा गया।

+0

धन्यवाद, बैरी। –

3
अप्रबंधित कोड से

? टीबीएच, मेरे पास सबसे अच्छा सुझाव है या तो "पी/इनवोक का उपयोग करें" या "यह समझें कि इसका क्या अर्थ है, और इसे फिर से कार्यान्वित करें"।

भले ही आप कर सकते हैं बंदरगाह के लिए कुछ अप्रबंधित कोड मिल जाए, और यहां तक ​​कि अगर यह काम करता है - यह वास्तव में फ़्रेमवर्क का लाभ उठाकर नहीं जा रहा है। और यह अप्रबंधित और प्रबंधित के बीच बिल्कुल 1: 1 नहीं है।

+1

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

2

आप इसे कठिन बना रहे हैं। Codeplex.com पर उपलब्ध आयरनी और कॉमन कंपाइलर इंफ्रास्ट्रक्चर लाइब्रेरी बाहर हैं, वे प्रबंधित कोड में लागू कंपाइलर्स को लक्षित हैं। अगला विकल्प अप्रबंधित मेटाडेटा इंटरफेस का उपयोग कर रहा है, जैसे IMetaDataAssemblyEmit, IMetaDataAssemblyImport, IMetaDataEmit2। हालांकि इन COM इंटरफेस को cor.h एसडीके हेडर फ़ाइल में घोषित किया जाता है, जो केवल सी/सी ++ प्रोग्राम द्वारा खपत के लिए उपयुक्त होता है। उनके लिए कोई प्रकार की लाइब्रेरी उपलब्ध नहीं है। इंटरफ़ेस घोषणाओं को दर्दनाक रूप से कॉपी करने से कम, आपको इन्हें डेल्फी घोषणाओं में परिवर्तित करने के लिए किसी प्रकार का टूल चाहिए। यकीन नहीं है कि यह मौजूद है या नहीं।

+1

मैंने 2 दिनों पहले मैन्युअल रूप से pas फ़ाइलों में अनुवाद (cor.h corhdr.h) का अनुवाद किया था। तो अप्रबंधित एपीआई मेरे कंपाइलर के देशी पक्ष के सामने के अंत में उपलब्ध है। लेकिन एपीआई विधि कार्यान्वयन के लिए एमएसआईएल उत्सर्जित करने के लिए समर्थन नहीं करता है। –

+0

आईसीजीजेन अप्रचलित है। मुझे एक प्रतिस्थापन के बारे में पता नहीं है। –

2

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

आप CIL instruction set से परिचित करना चाहते हैं।

तथ्य यह है कि अपने संकलक अप्रबंधित कोड कोई फर्क नहीं पड़ता है। आप जो भी प्रोग्राम चाहते हैं उससे सीआईएल टेक्स्ट उत्पन्न कर सकते हैं। जब यह तैयार हो, तो इसे ilasm के माध्यम से एक असेंबली बनाने के लिए भेजें।

+0

रोब, मैंने 3 साल पहले सर्ज लिडिन द्वारा ECMA335 के साथ-साथ "विशेषज्ञ .NET 2.0" पढ़ा है। (तो ilAsm बस मेरा एक और दोस्त है)। रॉब, क्या आप बैरी केली से पूछ सकते हैं या हो सकता है कि वे इस समस्या को हल कैसे करें। या वे सभी मिश्रित मोड सी ++ का उपयोग कर सकते हैं। –

+0

प्रिज्म कंपाइलर प्रिज्म के साथ बनाया गया है और यह 100% .NET अनुप्रयोग है। –

+0

धन्यवाद, रॉबर्ट। –