2008-09-16 7 views
6

के साथ विंडोज़ पर सी # कोड और उमेन सी ++ कोड मिलाकर मैं अपने सी # कोड से अपने अप्रबंधित सी ++ पुस्तकालयों को कॉल करना चाहता हूं। संभावित नुकसान और सावधानियां क्या हैं जिन्हें लेने की आवश्यकता है? आपके समय के लिए शुक्रिया।विजुअल स्टूडियो

उत्तर

1

यह प्रश्न बहुत व्यापक है। एकमात्र उचित उत्तर पी/Invoke है, लेकिन यह कहने की तरह है कि यदि आप विंडोज के लिए प्रोग्राम करना चाहते हैं तो आपको Win32 एपीआई पता होना चाहिए।

बहुत सारी किताबें पी/Invoke (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X) के बारे में लिखी गई हैं, और निश्चित रूप से पूरी वेबसाइटें बनाई गई हैं: http://www.pinvoke.net/

+0

किसी भी Win32 DLL पर __dll_exports के साथ काम नहीं करेगा? –

3

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

जाने का दूसरा मार्ग आपके पूर्ववर्ती सी ++ को COM कक्षाओं को लागू करना है और सी # को स्वत: जेनरेटेड इंटरऑप असेंबली के माध्यम से इसका उपयोग करना है। यदि आप COM के आसपास अपना रास्ता पर्याप्त रूप से जानते हैं तो इस तरह से आसान है।

उम्मीद है कि इससे मदद मिलती है।

0

आप पी/आमंत्रण के माध्यम से अप्रबंधित कोड में भी कॉल कर सकते हैं। यदि आपका कोड वर्तमान में COM का उपयोग नहीं करता है तो यह आसान हो सकता है। मुझे लगता है कि यदि आप इस मार्ग पर गए तो आपको शायद "सी" बाइंडिंग का उपयोग करके अपने कोड में कुछ विशिष्ट निर्यात बिंदु लिखने की आवश्यकता होगी।

शायद मेरे अनुभव में देखने के लिए आपको सबसे बड़ी चीज यह है कि निर्धारक कचरा संग्रह की कमी का मतलब है कि आपके विनाशक तब नहीं चलेंगे जब आपने सोचा होगा कि वे पहले होंगे। आपको यह ध्यान में रखना होगा और यह सुनिश्चित करने के लिए आईडीएसओस्पोजेबल या कुछ अन्य विधि का उपयोग करना होगा जब आप चाहते हैं कि आपका प्रबंधित कोड साफ़ हो जाए।

1

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

0

बेशक वहां हमेशा PInvoke भी होता है यदि आपने बाहरी कोड के साथ डीएलएल के रूप में अपना कोड पैक किया है। विकल्पों में से कोई भी दर्द मुक्त नहीं है। वे या तो ए पर निर्भर करते हैं) कॉम या प्रबंधित सी रैपर लिखने पर आपका कौशल बी) PInvoke पर अपनी बांह का पीछा करते हुए।

1

शुरू करने का सबसे आसान तरीका यह सुनिश्चित करना है कि सभी सी ++ कार्यक्षमता को 'सी' शैली के कार्यों के रूप में उजागर किया जाए। फ़ंक्शन को _stdcall के रूप में घोषित करना सुनिश्चित करें।

extern "सी" __declspec (dllexport) पूर्णांक _stdcall फू (पूर्णांक क)

सुनिश्चित करें कि आप विशेष रूप से संकेत तरह बातें मार्शलिंग सही हो, बनाओ & wchar_t *। यदि आपको यह गलत लगता है, तो डीबग करना मुश्किल हो सकता है।

इसे किसी भी तरफ से डीबग करें, लेकिन दोनों नहीं। मिश्रित मूल & प्रबंधित डीबगिंग करते समय, डीबगर बहुत धीमा हो सकता है। एक समय में 1 तरफ डिबगिंग बहुत समय बचाता है।

अधिक विशिष्ट प्राप्त करने के लिए एक और अधिक विशिष्ट प्रश्न की आवश्यकता होगी।

0

मैं swig पर एक नज़र डालेगा, हम अपने सी ++ एपीआई को अन्य भाषा प्लेटफ़ॉर्म पर बेनकाब करने के लिए हमारी परियोजना पर अच्छे प्रभाव के लिए इसका उपयोग करते हैं।

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

0

यदि आप एक अच्छा PInvoke उदाहरण चाहते हैं तो आप PInvoke.net देख सकते हैं। इसमें अधिकांश जीत एपीआई कार्यों को कॉल करने के उदाहरण हैं।

इसके अलावा आप इस आलेख Clr Inside Out: PInvoke से टूल का उपयोग कर सकते हैं जो आपकी .h फ़ाइल को C# wrappers में अनुवादित करेगा।

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

  • कोई संबंधित समस्या नहीं^_^