2011-02-07 27 views
5

के साथ समस्या मैं प्रबंधित सी # कोड में डीएल से अपने मूल सी ++ कार्यों का उपयोग करना चाहता हूं। लेकिन मेरे कार्य std :: vector & जैसे तर्क लेते हैं - एक वेक्टर संदर्भ ... मैं इस तर्क को dllimport कथन में कैसे कार्यान्वित कर सकता हूं? मुझे उदाहरण के लिए पता है कि इंटीपीआरटी और इतने पर हैं लेकिन std :: vector <> के लिए क्या होगा?सी # में देशी सी ++ कोड का उपयोग करना - std :: vector

+1

यह शायद बहुत मुश्किल है, अगर नहीं नामुमकिन हो जाएगा। क्या आप अपनी 'सी ++' लाइब्रेरी के लिए 'सी' इंटरफ़ेस प्रदान कर सकते हैं और इसके बजाय इसका उपयोग कर सकते हैं? – ereOn

+2

रैपर वर्ग बनाने के लिए सी ++/सीएलआई का उपयोग करें। –

+1

जबकि आप जो कुछ भी चाहते हैं उसके समान कुछ प्राप्त करने के लिए आप सशक्त समाधान का उपयोग कर सकते हैं, अगर मैं सही ढंग से समझता हूं तो आप अप्रबंधित डीएल और प्रबंधित अनुप्रयोग दोनों कोड को नियंत्रित करते हैं।इस मामले में शायद डीएल में अपने कार्यों के लिए सी ++/सीएलआई रैपर प्रदान करना बेहतर होगा और उन्हें सीधे सी # से कॉल करें। शायद आपको एसटीएल.Net पर भी एक नज़र डालना चाहिए। यहां एक प्राइमर का लिंक है: http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680

उत्तर

5

मैं "सी" कार्यों को निर्यात करता हूं जो आवश्यक कार्यक्षमता को लपेटते हैं और पी/उन्हें सी # से आमंत्रित करते हैं। ऐसा "सी" फ़ंक्शन 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); 

एक कॉलिंग को उस आईडी को एक आईडीस्पोजेबल क्लास में प्रबंधित पक्ष पर लपेटने के लिए एक अच्छी बात होगी जो सुनिश्चित करता है कि मूल संसाधन ठीक से है झुका हुआ

[यह कुछ हद तक तुच्छ, 'सी' कार्यों का कार्यान्वयन विवरण स्पष्ट रूप से पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है।]

0

एसटीएल वैक्टर अप्रबंधित टेम्प्लेट तरीके हैं। सिद्धांत रूप में आप वेक्टर के संबंधित तरीकों से ऑफ़सेट की गणना कर सकते हैं कुछ कोड पीढ़ी करते हैं और इसे कॉल करते हैं। आप DllImport का उपयोग नहीं कर सकते क्योंकि एसटीएल वैक्टर एक टेम्पलेट केवल लाइब्रेरी हैं जो निर्यात विधियों नहीं हैं। आप निश्चित रूप से एक सी शैली आवरण लिखने

int GetSize(vector<xxx> *vec) 
{ 
    return vec.size(); 
} 

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

आपका, Alois क्राउस

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