2010-08-16 21 views
8

this question के अनुसार सी ++/सीएलआई का उपयोग करके प्रबंधित और अप्रबंधित कोड को जोड़कर संभव है। मुझे काफी कुछ नहीं मिला - क्या वैसे भी प्रबंधित और अप्रबंधित के बीच marshalling नहीं होना चाहिए?सी ++ कोड सी ++/सीएलआई से कॉल किया जाता है जब marshalling प्रदर्शन किया जाता है?

उदाहरण के लिए, मेरे पास इनर लाइब्रेरी है जिसे एक मूल सी ++। डीएल के रूप में संकलित किया गया है जिसमें हेडर प्रकाशित किया गया है और सी ++/सीएलआई बाहरी पुस्तकालय जो इनर लाइब्रेरी से कोड कॉल करता है। क्या मार्शलिंग होगी? इसे कौन लागू करेगा और यह कितना महंगा होगा?

उत्तर

3

कोई मार्शलिंग नहीं होना चाहिए क्योंकि सी ++/सीएलआई असुरक्षित कोड को छोड़ने में सक्षम है जो कॉल को सीधे बनाता है। रिफ्लेक्टर में कुछ सी ++/सीएलआई कोड पर नज़र डालें - यह सी # से बहुत अलग दिखाई देगा।

यह ऐसा कुछ है जो सी # नहीं कर सकता (कम से कम, unsafe कीवर्ड और कुछ पॉइंटर हैक्स के बिना नहीं), और यह कुछ भी है जो शुद्ध-मोड सी ++/सीएलआई नहीं कर सकता (उसी कारण से सी #)।

.NET असुरक्षित कोड अप्रबंधित कार्यों को प्रत्यक्ष कॉल करने में सक्षम है; यह सिर्फ यह है कि सी ++/सीएलआई के अलावा यह क्षमता आसानी से उपलब्ध नहीं है।

+0

मुझे यह नहीं मिला। मान लें कि कोई अपने सी # कोड से OuterLibrary को कॉल करना चाहता है (और बाहरी पुस्तकालय आंतरिक रूप से इनर लाइब्रेरी में कॉल करेगा)। क्या वह बिना किसी मस्तिष्क के काम करने में सक्षम होगा? – sharptooth

+0

@ शार्पतोथ: केवल तभी जब आप सुलभ सार्वजनिक विधियां बनाते हैं जो आंतरिक रूप से आपके 'इनर लाइब्रेरी' को कॉल करते हैं। मेरा जवाब भी देखें, जिसमें कहा गया है कि मार्शलिंग हमेशा दिखाई नहीं देती है, सी ++/सीएलआई के साथ भी नहीं। – Abel

+0

@ शार्पेटोल, सी ++/सीएलआई के साथ, आप प्रभावी ढंग से मार्शलिंग कोड लिख रहे हैं –

3

मार्शलिंग अप्रबंधित डेटा लाने या प्रबंधित दुनिया में कॉल लाने की प्रक्रिया है। यह केवल — करता है ताकि — दोनों के बीच एक अनुवाद बोल सके।

सी ++/सीएलआई के साथ आप मिश्रण और मिलान कर सकते हैं। इसका मतलब है, यदि आप * .h फ़ाइल का उपयोग करके और पारंपरिक सी ++ कोड का उपयोग करके सीधे अपनी लाइब्रेरी का उपयोग करते हैं, तो यह अप्रबंधित और बिना मार्शल के होगा। यदि आप बीसीएल कक्षाओं या अपने स्वयं के प्रबंधित कोड का उपयोग कर उस डेटा तक पहुंचते हैं, तो आप हाथ से मार्शलिंग परत जोड़ रहे हैं, लेकिन केवल तभी आवश्यक हो। I.e, LPTSTR को एक प्रबंधित स्ट्रिंग में अनुवादित करने की आवश्यकता होगी जिसे एक के रूप में उपयोग किया जा सके। सी ++/सीएलआई का उपयोग करके, आप सुरक्षित, चेक किए गए प्रबंधित कोड का उपयोग न करने के खर्च पर, इस चरण को छोड़ सकते हैं और पारंपरिक सी ++ कोड पर चिपक सकते हैं, तेजी से और अधिक उदार कोड बना सकते हैं।

0

यह शामिल डेटा प्रकारों पर निर्भर करता है।

आंतरिक प्रकार के इस तरह के int, double, और इतने पर (string योग्य नहीं है) के रूप में दोनों देशी में एक ही प्रतिनिधित्व किया है और कोड में कामयाब रहे, कोई marshaling की आवश्यकता है। आंतरिक प्रकारों की Arrays उसी तरह से रखी जाती हैं (अगर हम मेटाडेटा .NET स्टोर को अनदेखा करते हैं, लेकिन यह सरणी सामग्री से अलग है)।

स्पष्ट लेआउट विशेषताओं का उपयोग करके वैल्यू प्रकार जहां सभी सदस्य आंतरिक प्रकार हैं, मेमोरी लेआउट-संगत भी हैं।

यदि डेटा प्रबंधित ढेर पर किसी ऑब्जेक्ट में संग्रहीत किया जाता है तो पिनिंग की आवश्यकता हो सकती है (यह सभी सरणी के लिए सच है)।

दूसरी ओर, कक्षा के प्रकारों को परिवर्तित/अनुवादित किया जाना चाहिए।

+0

यदि 'int',' double' आदि बॉक्स किए गए हैं, तो उनका आंतरिक प्रतिनिधित्व * देशी सी ++ संस्करण से अलग है। – Abel

+0

नहीं, यह नहीं है। मेटाडेटा हेडर जोड़ा गया है, लेकिन मान का प्रतिनिधित्व अपरिवर्तित है, इसलिए देशी कोड मूल्य को पिन करने से परे कोई मार्शलिंग के साथ सीधे मूल्य को पढ़ और लिख सकता है। –

2

marshalling invovled है, लेकिन आप (यानी प्रोग्रामर) इसे स्पष्ट रूप से करना चाहिए।

अपने सी ++ CLI OuterLibrary कॉल करता है एक समारोह है कि एक System.String/System::String^ लेता है, सी ++ प्रकार प्रणाली की आवश्यकता है कि आप इसे एक InnerLibrary समारोह है कि एक const char* लेता है पार करने से पहले एक प्रकार रूपांतरण प्रदर्शन करते हैं। आपको स्वयं रूपांतरण करना है - जो कि मार्शलिंग है।

माइक्रोसॉफ्ट जहाज को C++ Support Library कहा जाता है, जो सी ++ < -> सी ++ सीएलआई इंटरैक्शन के साथ मदद करने वाले कार्यों को प्रदान करता है।

0

यहां दो अंक हैं:

1) प्रबंधित/अप्रबंधित कोड संक्रमण: हर संक्रमण इसकी एक निश्चित मूल्य है। जब एक + असेंबली में सी ++/सीएलआई कोड संकलित किया जाता है, तो संकलक इस तरह के संक्रमण को कम करने के लिए, जब संभव हो, सभी कोड प्रबंधित करने की कोशिश करता है। जब बाहरी अप्रबंधित डीएल को सी ++/सीएलआई कोड से बुलाया जाता है, तो ऐसा अनुकूलन असंभव है। इसलिए, कम से कम समय-महत्वपूर्ण वर्गों में, इस तरह के संक्रमण को कम करना एक अच्छा विचार है। इसके बारे में यहां और देखें: http://msdn.microsoft.com/en-us/magazine/dd315414.aspx, प्रदर्शन और आपके इंटरऑप सीमा का स्थान

2) पैरामीटर्स marshalling। यह पैरामीटर प्रकार पर निर्भर करता है। कुछ पैरामीटर को मार्शल करने की आवश्यकता नहीं है, उदाहरण के लिए, int जैसे सरल प्रकार। तारों को marshalled किया जाना चाहिए। कुछ चाल, पिनिंग पॉइंटर्स की तरह, सरल प्रकार सरणी मार्शलिंग को रोकने की अनुमति देती है।

5

ठीक है, यह एक ऐसी सुविधा है जो सी ++/सीएलआई कंपाइलर में बनाई गई है, जिसे सी ++ इंटरऑप कहा जाता है। इसमें बहुत कम काला जादू शामिल है जो आप सोच सकते हैं। जेआईटी कंपाइलर आपके सी ++ कंपाइलर जेनरेट के रूप में सटीक उसी तरह के मशीन कोड उत्पन्न करता है। सभी .NET मान प्रकारों में सी ++ में प्रत्यक्ष समतुल्य है इसलिए कोई रूपांतरण की आवश्यकता नहीं है। यह स्वचालित रूप से संदर्भ प्रकारों को संभालता है, आपको इसे स्वयं करना है। pin_ptr <>, आमतौर पर।

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

+1

'KeyValuePair 'एक मान प्रकार है लेकिन इसका कोई प्रत्यक्ष समकक्ष नहीं है। वैल्यू प्रकार लेआउट-संगत हैं अगर प्रत्येक सदस्य लेआउट संगत (एक आंतरिक प्रकार या कोई अन्य लेआउट-संगत मान प्रकार) है। –

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

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