दिलचस्प पोस्ट
दृश्यमान बदलें लेकिन ग्राहकों को नॉकआउट.जेएस में सूचित नहीं करें डिफ़ॉल्ट मान के साथ बैश में एक वैरिएबल पढ़ें क्या विभिन्न डेटाबेस अलग नाम बोली का उपयोग करें? क्या लग सकता है कि किन भाषाओं को नियमित अभिव्यक्ति से मिलान किया जा सकता है? पिक्सेल में टेक्स्टरेय में कैरेट की ऑफसेट स्थिति प्राप्त करें जब आप किसी सी एप्लिकेशन से बाहर निकलते हैं, तो क्या मॉलोक-एड मेमोरी स्वचालित रूप से मुक्त है? Devise के सत्र नियंत्रक के लिए एक before_filter को कैसे छोड़ें? दो नंबरों का हैशोड बनाएं पीडीओ अपवादों को कैसे संभालना है jQuery में सहारा () और एट्रि () के बीच अंतर और जब attr () और prop () का उपयोग करने के लिए) क्या एक रिमोट रिपॉजिटरी में एक git छिपाने की जगह धक्का संभव है? जीएसी को विधानसभा को स्थापित करने / स्थापित करने का 'सही' तरीका क्या है? इकाई फ़्रेमवर्क 4.1+ कई-से-कई रिश्तों को ट्रैकिंग बदलते हैं XPath का उपयोग कर विशेषता प्राप्त करना मुझे OSV पर JAVA_HOME को क्या सेट करना चाहिए?

सी ++ / सीएलआई मिश्रित मोड डीएलएल सृजन

मुझे एक मूल सी + + डीएलएल मिल गया है जिसके लिए मुझे सी ++ / सीएलआई आवरण परत होना है। जो मैंने समझा है, अगर आप परियोजना में सी + + / सीएलआई वर्ग को आसान बनाते हैं, तो वीएस मिश्रित मोड के रूप में संकलित करेगा, लेकिन मुझे जाहिरा तौर पर गलत था क्योंकि VS को प्रबंधित कोड को भी छुआ नहीं लगता।

इसलिए, एक पूर्व-मौजूदा मूल कोड-बेस दिया गया है , जो एक मिश्रित मोड DLL बनाने के लिए आपको क्या करना चाहिए, ताकि मैं किसी भी .NET भाषा से उस कोड में लिंक कर सकूं?

* मुझे ऐसा करने की ज़रूरत है क्योंकि मेरा मूल कोड सी ++ क्लासेस का उपयोग करता है, जिसे मैं पी / इनकॉवेन नहीं कर सकता।

Solutions Collecting From Web of "सी ++ / सीएलआई मिश्रित मोड डीएलएल सृजन"

ठीक है, नहीं, जब तक आप सी ++ / सीएलआई कंपाइलर नहीं बताते हैं कि आपके लीगेसी डीएलएल अप्रबंधित कोड में लिखा गया था, तब तक यह मिश्रण-मोड नहीं हो सकता। जो ध्यान देने योग्य होना चाहिए था, आपको अप्रबंधित DLL निर्यात से लिंकर त्रुटियां मिलनी चाहिए। आपको #pragma प्रबंधित का उपयोग करने की आवश्यकता है:

#pragma managed(push, off) #include "oldskool.h" #pragma comment(lib, "oldskool.lib") #pragma managed(pop) using namespace System; public ref class Wrapper { private: COldSkool* pUnmanaged; public: Wrapper() { pUnmanaged = new COldSkool; } ~Wrapper() { delete pUnmanaged; pUnmanaged = 0; } !Wrapper() { delete pUnmanaged; } void sampleMethod() { if (!pUnmanaged) throw gcnew ObjectDisposedException("Wrapper"); pUnmanaged->sampleMethod(); } }; 

अपने मौजूदा कोड को प्रभावित करने से रोकने के लिए एक अच्छा विकल्प / सभी मौजूदा कोड को मूल स्थैतिक लाइब्रेरी में संकलित करना है और उसके बाद आपकी C ++ / CLI dll के लिंक चरण में स्थिर पुस्तकालय शामिल करना है।

एक नया सी ++ / सीएलआई प्रोजेक्ट शुरू करें और उसके बाद अपनी मूल कक्षाएं ले जाएं।

प्रोजेक्ट स्तर पर "आम भाषा रनटाइम सपोर्ट" को चालू करने के बजाय, फ़ाइल-बाय-फाईल के आधार पर फाइल के गुणों को देखते हुए, और सी / सी ++ पर जाकर इसे सक्षम करना संभव है। जनरल | आम भाषा का समर्थन

अलग-अलग सी ++ / सीएलआई डीएलएल बनाने की बजाय, या बहुत सारे प्रबंधित / अप्रबंधित प्रोगैमाओं का उपयोग करने के बजाय, यह एक ही परियोजना में अपना मूल और सी ++ / सीएलआई कोड बनाना आसान बना सकता है।

तो बस उस सी ++ / CLI .NET आवरण वर्ग पर आप लिखना चाहते हैं।

यदि आपके पास मूल सी ++ के साथ DLL का स्रोत कोड है, तो आप मिश्रित मोड में प्रबंधित C ++ का उपयोग कर सकते हैं। माइक्रोसॉफ्ट कुछ समय के लिए कुछ प्रसिद्ध इंटरनेट एक्सचेंज के माइक्रोसॉफ्ट के एक संदर्भ परियोजना के लिए है। NET। एक मिश्रित मोड में प्रबंधित C ++ का उपयोग किया। कोड का एक हिस्सा प्रबंधित कोड के रूप में पुनः लिखा गया था। मिश्रित मोड में एक भाग को सी + + के रूप में संकलित करने के लिए जल्द ही परिवर्तित किया गया था और एक हिस्सा असेंबल कोड के रूप में संकलित किया गया था (प्रदर्शन कारण के कारण), लेकिन असुरक्षित कोड के रूप में सीधे प्रबंधित कोड के अंदर भी उपयोग किया गया। इस तरह के प्रवास का परिणाम अंतिम अनुप्रयोग में वास्तव में बहुत अच्छा प्रदर्शन के लिए होता है। इस तरह आप देशी और प्रबंधित कोड के बीच मार्शल करने के लिए समय नहीं बिताते हैं। सुरक्षित और असुरक्षित प्रबंधित कोड के बीच मार्शलिंग बहुत तेज़ है शायद आप भी इस तरह से चुनना चाहिए?

मैंगेड के अंदर डीएलएल से देशी कोड कॉल करने वाला एक और रास्ता अच्छी तरह से जाना जाता है। प्रत्येक C ++ फ़ंक्शन के बिना नामों के नाम ( http://www.dependencywalker.com/ का उपयोग करें वहां देखें)। यदि आपकी C ++ DLL निर्यात क्लासेस और सी-फ़ंक्शन नहीं, तो यह DLL खराब डिज़ाइन किया गया है। अच्छा डिज़ाइन किया गया डीएलएल या तो सी-जैसे फ़ंक्शंस निर्यात करता है या कॉम-इंटरफेस निर्यात करता है। यदि आपके पास ऐसी "खराब" DLL है और आप COM को लिखने में समय व्यतीत नहीं करना चाहते हैं, तो आप आसानी से एक और डीएलएल लिख सकते हैं जो कि एक भूमिका निभाएंगे। यह डीएलएल सभी सी ++ वर्गों को आयात करता है ( http://msdn.microsoft.com/en-us/library/81h27t8c.aspx देखें, एक सीएलएल और http://www.codeproject.com/KB/cpp/ से सी ++ क्लास निर्यात करना howto_export_cpp_classes.aspx उदाहरण के लिए) से "खराब" DLL और सी-जैसे फ़ंक्शन निर्यात करें। इस तरह भी ठीक है।

सी ++ परियोजना फाइल को / CLR विकल्प की आवश्यकता है। इसे सामान्य टैब पर संपूर्ण प्रोजेक्ट के लिए सेट किया जा सकता है, मुझे विश्वास है, या अलग-अलग फ़ाइलों पर सेट किया गया है।

एक बार सीएलआर विकल्प निर्दिष्ट किया जाता है तो विजुअल स्टूडियो उस श्रेणी को सी ++ / सीएलआई का उपयोग कर देगा।