दिलचस्प पोस्ट
MySQL में दो डेटासेट के बीच अंतर की गणना करें मैं ऑवैइडटाबलऑब्जेक्ट का उपयोग कैसे करूं? कैसे गतिशील tablenames के साथ एसक्यूएल इंजेक्शन को रोकने के लिए? यूनिक्स टाइमस्टैम्प को डेटटाइम कन्वर्ट और अजगर में इसे वापस परिवर्तित करें रेगेक्स पैटर्न को मैच करने के लिए, को छोड़कर जब … / बीच में को छोड़कर GitHub में कांटे के बीच विलय एंड्रॉइड सभी संपर्क सूची (नाम, ईमेल, फोन) को लेकर करीब 700 संपर्कों के लिए एक मिनट लेता है SQLite डेटाबेस से डुप्लिकेट पंक्तियों को हटा रहा है जावास्क्रिप्ट ईएस 6 कक्षाओं में निजी संपत्तियां एक शेबांग (यानी #!) के साथ awk के लिए कई तर्कों का उपयोग कैसे करें? क्या यह स्पष्ट रूप से बूलियन स्थिरांक से तुलना करना बुरा है जैसे जावा में (बी == गलत)? ईएक्स के खिलाफ 'टेस्टएल' ईएक्स? मैं एक सीएसवी फ़ाइल में एक पायथन डिक्शनरी कैसे लिखूं? आप पीओएसआईसीएस तिथि को वर्ष के आर में कैसे बदल सकते हैं? लिंक और स्क्रिप्ट टैग्स में सीएसएस और जावास्क्रिप्ट यूआरएल को "? V = 1" को क्या जोड़ता है?

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

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

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

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

वेब के समाधान से एकत्रित समाधान "सी ++ / सीएलआई मिश्रित मोड डीएलएल सृजन"

ठीक है, नहीं, जब तक आप सी ++ / सीएलआई कंपाइलर नहीं बताते हैं कि आपके लीगेसी डीएलएल अप्रबंधित कोड में लिखा गया था, तब तक यह मिश्रण-मोड नहीं हो सकता। जो ध्यान देने योग्य होना चाहिए था, आपको अप्रबंधित 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 विकल्प की आवश्यकता है। इसे सामान्य टैब पर संपूर्ण प्रोजेक्ट के लिए सेट किया जा सकता है, मुझे विश्वास है, या अलग-अलग फ़ाइलों पर सेट किया गया है।

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