शायद यहां जाने के लिए सबसे अच्छा तरीका है रीडायरेक्ट करने के लिए उपयोग पी/आह्वान या प्लेटफार्म आह्वान है। संरचना या आपके सी ++ डीएल इंटरफ़ेस के आधार पर आप इसे शुद्ध सी इंटरफ़ेस में लपेटना चाहते हैं; यदि आपका इंटरफ़ेस केवल blittable प्रकारों का उपयोग करता है तो यह सबसे आसान है। यदि आप अपने डीएल इंटरफेस को ब्लिटेबल प्रकारों (इंट 32, सिंगल, बूलियन, इंट 32 [], सिंगल [], डबल [] - मूलभूत) तक सीमित करते हैं तो आपको प्रबंधित (सी #) के बीच डेटा की जटिल जटिलता करने की आवश्यकता नहीं होगी। और अप्रबंधित (सी) स्मृति रिक्त स्थान।
उदाहरण के लिए, आपके सी # कोड में आप DllImport विशेषता का उपयोग करके अपने सी/सी ++ डीएल में उपलब्ध कॉल को परिभाषित करते हैं।
[DllImport, "ExactDllName.dll"]
static extern boolean OneOfMyCoolCRoutines([In] Double[] x, [In] Double[] y, [Out] Double result)
थोड़ा [में] की और [बाहर] की सख्ती से आवश्यक नहीं हैं, लेकिन वे साथ इसकी गति कर सकते हैं। अब आपके सी # प्रोजेक्ट के संदर्भ के रूप में अपना "ExactDllName.dll" जोड़ा गया है, तो आप अपने सी # सी से अपने सी/सी ++ फ़ंक्शन को कॉल कर सकते हैं।
fixed(Double *x = &x[0], *y = &y[0])
{
Boolean returnValue = OneOfMyCoolCRoutines(x, y, r);
}
ध्यान दें कि मैं अनिवार्य रूप से वापस और चौथे मेरी dll और सी # कोड के बीच संकेत गुजर रहा हूँ। इससे स्मृति कीड़े पैदा हो सकती हैं क्योंकि उन सरणी के स्थान सीएलआर कचरा कलेक्टर द्वारा बदला जा सकता है, लेकिन सी/सी ++ डीएल इसके बारे में कुछ भी नहीं जान पाएगा। तो इसके खिलाफ सुरक्षा के लिए, मैंने बस उन बिंदुओं को अपने सी # में ठीक कर दिया है, और अब वे स्मृति में नहीं चले जाएंगे जबकि मेरा डीएल उन सरणी पर काम कर रहा है। यह अब असुरक्षित कोड है और मुझे अपने सी # कोड डब्ल्यू/उस ध्वज को संकलित करने की आवश्यकता होगी।
भाषा इंटरऑप के लिए बहुत बढ़िया विवरण हैं, लेकिन आपको रोलिंग करना चाहिए। यदि संभव हो तो ब्लिटेबल प्रकारों के एक स्टेटलेस सी इंटरफेस पर चिपकना एक महान नीति है। यह आपकी भाषा इंटरऑप कोड को सबसे साफ रखेगा।
गुड लक,
पॉल
आप एक COM इंटरफेस जोड़ने विचार किया है? चूंकि, आईएमएचओ, COM कंटेनर के साथ तर्क और प्रोग्राम डेटा पास करने का समाधान हो सकता है। –