के साथ समस्या मैं प्रबंधित सी # कोड में डीएल से अपने मूल सी ++ कार्यों का उपयोग करना चाहता हूं। लेकिन मेरे कार्य std :: vector & जैसे तर्क लेते हैं - एक वेक्टर संदर्भ ... मैं इस तर्क को dllimport कथन में कैसे कार्यान्वित कर सकता हूं? मुझे उदाहरण के लिए पता है कि इंटीपीआरटी और इतने पर हैं लेकिन std :: vector <> के लिए क्या होगा?सी # में देशी सी ++ कोड का उपयोग करना - std :: vector
उत्तर
मैं "सी" कार्यों को निर्यात करता हूं जो आवश्यक कार्यक्षमता को लपेटते हैं और पी/उन्हें सी # से आमंत्रित करते हैं। ऐसा "सी" फ़ंक्शन std::vector<>
डेटा को पॉइंटर और डेटा बफर के आकार के रूप में बेनकाब कर सकता है।
उदाहरण के लिए कहते हैं कि तुम एक वर्ग Buffer
में एक std::vector<byte_t>
है:
class Buffer
{
public:
const std::vector<byte_t>& GetData() const { return data_; }
private:
std::vector<byte_t> data_;
};
तो फिर तुम एक 'सी' ठीक तरह से कार्य करने के लिए गुंजाइश निर्यात कर सकते हैं Buffer
आप उपयोग करना चाहते:
Buffer* CreateBuffer();
और आप शायद मूल पक्ष पर कुछ करना चाहते हैं जो std::vector<byte_t>
को डेटा के साथ भरता है:
void DoSomethingThatProduceData(Buffer* buffer);
तो फिर तुम उस डेटा पढ़ सकते हैं:
void GetBufferData(const Buffer* buffer, const byte_t** data, int* size);
और आखिरी, साफ:
void DestroyBuffer(Buffer* buffer);
अनुवाद पी करने के लिए उन 'सी' घोषणाओं/सी # तरफ लोगों आह्वान:
[DllImport("YourBufferLib.dll")]
static extern IntPtr CreateBuffer();
[DllImport("YourBufferLib.dll")]
static extern void DoSomethingThatProduceData(IntPtr buffer);
[DllImport("YourBufferLib.dll")]
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size);
[DllImport("YourBufferLib.dll")]
static extern void DestroyBuffer(IntPtr buffer);
एक कॉलिंग को उस आईडी को एक आईडीस्पोजेबल क्लास में प्रबंधित पक्ष पर लपेटने के लिए एक अच्छी बात होगी जो सुनिश्चित करता है कि मूल संसाधन ठीक से है झुका हुआ
[यह कुछ हद तक तुच्छ, 'सी' कार्यों का कार्यान्वयन विवरण स्पष्ट रूप से पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है।]
एसटीएल वैक्टर अप्रबंधित टेम्प्लेट तरीके हैं। सिद्धांत रूप में आप वेक्टर के संबंधित तरीकों से ऑफ़सेट की गणना कर सकते हैं कुछ कोड पीढ़ी करते हैं और इसे कॉल करते हैं। आप DllImport का उपयोग नहीं कर सकते क्योंकि एसटीएल वैक्टर एक टेम्पलेट केवल लाइब्रेरी हैं जो निर्यात विधियों नहीं हैं। आप निश्चित रूप से एक सी शैली आवरण लिखने
int GetSize(vector<xxx> *vec)
{
return vec.size();
}
जैसे विशिष्ट तरीकों कॉल करने के लिए कर सकता है लेकिन आपको लगता है कि क्योंकि इस के लिए आवश्यक कई कामयाब unmanged बदलाव अचानक रोकने के लिए अपने आवेदन लाना होगा करने के लिए नहीं करना चाहती। यदि आपको एसटीएल वैक्टरों में हेरफेर करने की ज़रूरत है तो आपकी सबसे अच्छी शर्त प्रबंधित सी ++ का उपयोग करना है और सी # से कॉल को अपने प्रबंधित सी ++ डीएल में कॉल करने के लिए वैक्टरों में हेरफेर करने के लिए कॉल करना है। कई कंपनियों में प्रबंधित सी ++ का उपयोग प्रतिबंधित कर दिया गया था क्योंकि लोगों ने प्रबंधित अप्रबंधित संक्रमणों की लागत पर ध्यान नहीं दिया, जिससे सी ++ ने अपनी मुख्य परिसंपत्ति को खोला: स्पीड।
आपका, Alois क्राउस
- 1. सी ++: std :: vector
- 2. देशी (सी ++) कोड
- 3. std :: vector
- 4. std :: vector
- 5. std :: vector को सरणी
- 6. std :: vector
- 7. std :: vector और std :: list
- 8. std :: vector से दूसरे
- 9. देशी सी ++
- 10. सीधे सी ++ std में पढ़ा() का उपयोग करना: वेक्टर
- 11. Std :: move का उपयोग करना
- 12. एक std :: vector
- 13. देशी सी ++
- 14. देशी सी ++
- 15. क्या मुझे अपनी कक्षा में std :: vector सदस्य चर में std :: unique_ptr <T> का उपयोग करना चाहिए?
- 16. सी ++ में NaN का उपयोग करना?
- 17. देशी डीएल से सी # अनुप्रयोग
- 18. एक std :: vector को std :: valarray
- 19. कनवर्ट करना (शून्य *) से std :: vector <unsigned char>
- 20. सी ++ में सी-स्टाइल स्ट्रिंग पर किसी को std :: स्ट्रिंग का उपयोग क्यों करना चाहिए?
- 21. सी # देशी सी ++ कॉलिंग सभी कार्यों: किस प्रकार का उपयोग करना है?
- 22. सी ++: एक std :: वेक्टर की शुरुआत का पता प्राप्त करना?
- 23. बूस्ट :: पायथन: पायथन सूची std :: vector
- 24. सीवी :: मैट से std :: vector
- 25. स्व-निहित, एसटीएल-संगत कार्यान्वयन std :: vector
- 26. देशी सिस्टम कॉल का उपयोग कर सी ++ में ध्वनि बजाना?
- 27. सी ++ 11 std :: array
- 28. std :: vector :: clear() कन्स्ट्रक्टर और विनाशक में
- 29. सी # अन्य कोड का उपयोग
- 30. सी ++ 11 std :: वेक्टर समवर्ती वातावरण में
यह शायद बहुत मुश्किल है, अगर नहीं नामुमकिन हो जाएगा। क्या आप अपनी 'सी ++' लाइब्रेरी के लिए 'सी' इंटरफ़ेस प्रदान कर सकते हैं और इसके बजाय इसका उपयोग कर सकते हैं? – ereOn
रैपर वर्ग बनाने के लिए सी ++/सीएलआई का उपयोग करें। –
जबकि आप जो कुछ भी चाहते हैं उसके समान कुछ प्राप्त करने के लिए आप सशक्त समाधान का उपयोग कर सकते हैं, अगर मैं सही ढंग से समझता हूं तो आप अप्रबंधित डीएल और प्रबंधित अनुप्रयोग दोनों कोड को नियंत्रित करते हैं।इस मामले में शायद डीएल में अपने कार्यों के लिए सी ++/सीएलआई रैपर प्रदान करना बेहतर होगा और उन्हें सीधे सी # से कॉल करें। शायद आपको एसटीएल.Net पर भी एक नज़र डालना चाहिए। यहां एक प्राइमर का लिंक है: http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680