2012-01-18 19 views
7

मेरा पहला प्रश्न यहां :)सी ++ से सी # तक ऑब्जेक्ट्स की सूची कैसे पास करें?

मैं सी ++ (एक गेम के लिए एक मानचित्र संपादक) में लिखे गए एक आवेदन के साथ काम कर रहा हूं जिसमें फ्रंट एंड यूआई सी # में लिखा गया है। चूंकि मैं सी # के लिए नया हूं, इसलिए मैं सी ++ पक्ष पर जितना संभव हो उतना करने की कोशिश कर रहा हूं।

सी # से मैं एक सी ++ फ़ंक्शन को कॉल करना चाहता हूं जो सरल चर प्रकारों (int और स्ट्रिंग) के साथ structs की एक सूची वापस कर देगा ताकि मैं उनके साथ यूआई में एक सूची बॉक्स बना सकूं। क्या यह संभव है? मुझे सी # में डीएलएल आयात समारोह कैसे लिखना चाहिए?

मैंने जवाब के लिए यहां खोज करने की कोशिश की है, लेकिन मुझे केवल सी # से सी ++ में सूचियों को पास करने के तरीके पर पोस्ट मिला है।

सी ++ कोड:

struct PropData 
{ 
PropData(const std::string aName, const int aId) 
{ 
    myName = aName; 
    myID = aId; 
} 

std::string myName; 
int myID; 
}; 

extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData() 
{ 
std::vector<PropData> myProps; 

myProps.push_back(PropData("Bush", 0)); 
myProps.push_back(PropData("Tree", 1)); 
myProps.push_back(PropData("Rock", 2)); 
myProps.push_back(PropData("Shroom", 3)); 

return myProps; 
} 

सी # आयात समारोह:

[DllImport("MapEditor.dll")] 
    static extern ??? GetPropData(); 

संपादित करें:

एड एस से पोस्ट मैं struct PropData लिए C++ कोड बदल के बाद { प्रोपडाटा (कॉन्स std :: स्ट्रिंग एनाम, कॉन्स int एआईडी) { myName = aName; myID = aId; }

std::string myName; 
    int myID; 
}; 

extern "C" _declspec(dllexport) PropData* _stdcall GetPropData() 
{ 
    std::vector<PropData> myProps; 

    myProps.push_back(PropData("Bush", 0)); 
    myProps.push_back(PropData("Tree", 1)); 
    myProps.push_back(PropData("Rock", 2)); 
    myProps.push_back(PropData("Shroom", 3)); 

    return &myProps[0]; 
} 

और सी # [DllImport ("MapEditor.dll")] स्थिर निर्वासन PropData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

    private void GetPropDataFromEditor() 
    { 
     List<PropData> myProps = GetPropData(); 
    } 

लेकिन निश्चित रूप से यह GetPropData के रूप में संकलित नहीं करता है() कुछ भी है कि एक सूची के लिए अनुवाद वापस नहीं करता है।

धन्यवाद मुझे बहुत कुछ प्राप्त करने के लिए एड एस। धन्यवाद!

उत्तर

9

आप std::vector को सी # क्षेत्र में मार्शल करने में सक्षम नहीं होंगे। इसके बदले आपको क्या करना चाहिए एक सरणी वापस करना है। इंटरऑप स्थितियों का सामना करते समय बुनियादी प्रकारों से चिपकने से चीजों को और अधिक सरल बना दिया जाता है।

std::vector गारंटी देता है कि & v [0] पहले तत्व को इंगित करता है और सभी तत्वों को संगत रूप से संग्रहीत किया जाता है, इसलिए सरणी को वापस पास करें। यदि आप सी ++ इंटरफ़ेस के साथ फंस गए हैं (जो मुझे नहीं लगता है) तो आपको COM जैसे कुछ जटिल तंत्र को देखना होगा।

+0

क्या वह संरचना का उपयोग भी नहीं कर सका? बेशक यह एक भाषा में सब कुछ करना आसान होगा। यदि फ्रंट-एंड सी # में लिखा गया है तो सी # में सबकुछ करना संभव होना चाहिए। –

+0

त्वरित उत्तर के लिए धन्यवाद, लेकिन मुझे सी # सिंटैक्स के साथ और मदद की ज़रूरत है, जैसा कि मैंने कहा था कि मैं भाषा में नया हूं (अभी शुरू हुआ), मुझे यह भी पता नहीं था कि यह पॉइंटर्स को संभाल सकता है। – Cousken

+0

@ रामहाउंड: मुझे नहीं लगता कि आप एक सी # संरचना बनाने में सक्षम होंगे जो वास्तव में 'std :: vector' की नकल करता है। यह केवल पीओडी प्रकारों के लिए काम करता है। –

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