2009-05-12 20 views
6

मेरे पास व्यापक रूप से अप्रबंधित विंडोज सीई 5 सी ++ कोड है जो एक यूआई प्रदान करता है जिसे मैं एक नए उत्पाद में बड़े व्यवसाय और संचार के साथ संयोजन करके उपयोग करना चाहता हूं विंडोज सीई 6 और कॉम्पैक्ट फ्रेमवर्क पर प्रबंधित सी # में लिखा तर्क।हाउटो: विंडोज़ कॉम्पैक्ट फ्रेमवर्क पर अप्रबंधित सी ++ से प्रबंधित सी # इंटरफेस पर कॉल करें

यूआई व्यापार तर्क के बारे में जान सकता है, लेकिन मैं यूआई के व्यापार तर्क को अनजान करना चाहता हूं जैसे कि मैं बाद में इसे एक प्रबंधित संस्करण, या किसी अन्य यूआई के साथ बदल सकता हूं जिसे मैं फ्रंट एंड के रूप में चुनता हूं।

मुझे एक लेख मिला जो कि विंडोज दुनिया में पुल के रूप में COM का उपयोग करने का वर्णन करता है, लेकिन मुझे WinCE के तहत .NET CF में इसे लागू करने में कठिनाई हो रही है। अतीत में, मैंने अन्य पुस्तकालयों पर इंटरफेस के लिए पॉइंटर्स प्राप्त करने के लिए प्रकार पुस्तकालयों का उपयोग किया है और COM कॉल (CoInitialize(), CoCreateInstance()) का उपयोग किया है, और यही वह रणनीति है जिसे मैं इस समय पीछा कर रहा हूं: COM का उपयोग सीधे मेरी प्रबंधित लाइब्रेरी में सी # इंटरफेस तक पहुंचने के लिए अप्रबंधित सी ++ लाइब्रेरी, यह मानते हुए कि WinCE में एक ही सुविधा प्रदान की जाती है।

यहां मेरी समस्या है: टाइपेलिब। यह मेरे प्रबंधित सी # लाइब्रेरी से उपलब्ध नहीं है क्योंकि मैंने इसे अतीत में '#import "SomeCPPLibrary.dll" कथन के माध्यम से उपयोग किया है। मेरा मानना ​​है कि इसे डीडी असेंबली में दफनाया गया है, जो अतीत में अलग-अलग तरीके से संग्रहीत है और इसलिए, लाइब्रेरी के #import के माध्यम से सीधे उपलब्ध नहीं है। मुझे लगता है कि मैं # टाइपेलिब आयात कर सकता हूं, लेकिन मुझे अपने प्रबंधित .dll से टाइपेलिब निकालने का कोई तरीका नहीं मिल रहा है, और जब भी मैं एक इंटरफ़ेस परिभाषा फ़ाइल (.idl) को एक साथ हैक कर सकता हूं और प्लेटफ़ॉर्म के midl.exe का उपयोग कर सकता हूं इससे एक .tlb उत्पन्न करने के लिए, कोई गारंटी नहीं है कि मेरा .idl, और इसलिए, परिणामी .tlb, वास्तव में मेरे सी # .dll में मेल खाएगा। मुझे यह भी पता नहीं है कि प्लेटफॉर्म midl.exe इस तरीके से काम करता है लेकिन मान लें कि यह करता है।

  1. क्या मैं गलत पेड़ को भड़क रहा हूं? क्या किसी भी COM इंटरफ़ेस के माध्यम से अप्रबंधित C++ में प्रबंधित सी # इंटरफ़ेस का उपयोग करना संभव है?

  2. की स्थापना करता है [विधानसभा: ComVisible (सही)] अपने AssemblyInfo.cs फ़ाइल में विशेषता कामयाब विधानसभा में सभी इंटरफेस उपलब्ध कॉम के माध्यम से अप्रबंधित दुनिया में GUID AssemblyInfo.cs को परिभाषित करता है के माध्यम से कर सकते हैं या मेरे पास हैं कुछ और करने के लिए?

  3. मैं प्रबंधित .dll से टाइपेलिब कैसे प्राप्त करूं ताकि मेरी अप्रबंधित सी ++ लाइब्रेरी # आयात कर सके?

  4. मैंने अप्रबंधित सी ++ लाइब्रेरी प्रोजेक्ट में संदर्भ के रूप में अपना प्रबंधित सी # लाइब्रेरी प्रोजेक्ट जोड़ने का प्रयास किया, लेकिन यह मदद नहीं प्रतीत होता। क्या इस तरह के संदर्भ में इस तरह के संदर्भ प्रासंगिक हैं?

  5. अप्रबंधित सी ++ दुनिया से प्रबंधित सी # कोड को कॉल करने की मूल समस्या को हल करने के लिए कोई बेहतर तरीका है? मैंने जो कुछ भी यहां पढ़ा है वह एक मिश्रित मोड लिबररी है जो प्रबंधित अनुवाद परत के साथ अप्रबंधित/प्रबंधित अंतराल को पुल करने के लिए है। मुझे यकीन नहीं है कि एक अच्छी रणनीति है क्योंकि कॉल प्रतिक्रिया गति एक महत्वपूर्ण कारक है, लेकिन यह लंबे समय तक बेहतर हो सकता है क्योंकि मैं किसी बिंदु पर प्रबंधित सी # को यूआई को फिर से लिखने की योजना बना रहा हूं, और इस प्रकार सभी प्रयासों को अधिक स्थायी व्यापार/कॉमर्स तर्क के साथ मिलकर बजाए यूआई फेंक दें? इस सवाल के जवाब के बावजूद, मैं अभी भी COM का उपयोग करने की समस्या को हल करना चाहता हूं, अगर जिज्ञासा से कोई अन्य कारण नहीं है।

+0

+1 अच्छा लेखन –

उत्तर

3

मैंने WinCE में सी ++ से सी # कॉल करने का प्रयास किया है। मुझे विश्वास नहीं है कि कॉम्पैक्ट फ्रेमवर्क द्वारा प्रदान किया गया कोई भी COM समर्थन है, इसलिए आप ComVisible (true) का उपयोग नहीं कर सकते हैं।

मुझे सी ++ में .NET होस्ट करने का कोई तरीका नहीं मिला क्योंकि फिर से कार्यक्षमता कॉम्पैक्ट फ्रेमवर्क में प्रकट नहीं हुई थी।

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

+0

ऐसा करने के लिए यह एक शानदार तरीका है। यदि मूल कोड एक डीएल में है, तो मुझे यह भी नहीं लगता कि आपको संदेश कतारों की आवश्यकता होगी। सी # कोड सीधे कार्यों का आह्वान कर सकता है, और जब आप आवश्यक हो तो सी # को कॉल करने के लिए एक तरीका प्रदान करने के लिए आप देशी डीएल में प्रतिनिधियों/फ़ंक्शन पॉइंटर्स को सी # से पास कर सकते हैं। – tcarvin

2

आप गलत पेड़ को भड़क रहे हैं। देशी कोड को प्रबंधित कोड में कॉल करने के लिए, मूल कोड को सीएलआर के निष्पादन इंजन को स्पिन करना होता है। इसे CLR Hosting के रूप में जाना जाता है, और यह सीएफ में समर्थित नहीं है। इसका मतलब यह है कि आप इसे आसानी से नहीं कर सकते - क्रिएटिव हैकिंग के साथ भी नहीं (मेरा विश्वास करो, मैं हर गली कोशिश कर रहा हूं)।

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

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