2011-06-16 9 views
9

मैं एक साधारण नेट dll साथ VS2010 सी # है कि एक वर्ग के 2 स्थिर सदस्योंसी ++/CLI-> सी # त्रुटि C2526: सी लिंकेज समारोह सी वापस नहीं लौट सकते ++ वर्ग

public class Polygon 
{ 
    public static void Test(int test) {} 
    public static void Test(List<int> test) {} 
} 

मैं तो एक कंसोल बनाया को उजागर करता है बनाया है VS2010 सी से एप्लिकेशन ++ और

extern "C" void TestMe() 
{ 
    Polygon::Test(3); 
} 

संदर्भ और संकलन जोड़ा जा रहा है मुझे इस त्रुटि देता है _tmain ऊपर इस समारोह जोड़ा

1>WierdError.cpp(9): error C2526: 'System::Collections::Generic::List<T>::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::List<T>::Enumerator' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   WierdError.cpp(9) : see declaration of 'System::Collections::Generic::List<T>::Enumerator' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   WierdError.cpp(9) : see reference to class generic instantiation 'System::Collections::Generic::List<T>' being compiled 
1>   with 
1>   [ 
1>    T=int 
1>   ] 

मेरी टिप्पणियों में से कुछ:

  • यह सफलतापूर्वक संकलित अगर मैं हटाने extern "सी"
  • यह सफलतापूर्वक संकलित अगर मैं नाम बदलने Test(List<int> test)Test2(List<int> test) करने के लिए

मेरा प्रश्न है, क्या गलत हो रहा है और कैसे इसे C++ पक्ष से ठीक करने के लिए।

मेरा वर्तमान कामकाज सी # में विधि का नाम बदलना है, लेकिन मुझे ऐसा करने की ज़रूरत नहीं है, मुझे लगता है कि मेरे सी ++ प्रोजेक्ट में एक सेटिंग हो सकती है।

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

मैं सी ++ में एक बेहतर वैकल्पिक हल मिल गया है, ऐसा लगता है कि मैं एक समारोह में नेट कॉल लपेट कर सकते हैं।

void wrapper() 
{ 
    Polygon::Test(3); 
} 

extern "C" void TestMe() 
{ 
    wrapper(); 
} 

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

+0

मैं इस त्रुटि को दोबारा नहीं कर सकता। सी ++/सीएलआई प्रोजेक्ट बनाने के लिए आपने किस प्रोजेक्ट टेम्पलेट का उपयोग किया था? मुझे संदेह है कि आपने गलत चुना है, क्योंकि सीएलआर प्रोजेक्ट टेम्पलेट्स में से कोई भी '_tmain' एंट्री पॉइंट परिभाषित नहीं करता है। – ildjarn

+0

मुझे लगता है कि यह Win32 कंसोल था, फिर मैं सेटिंग्स में गया और जोड़ा/clr समर्थन, मैं कल सत्यापित करूँगा। – PeskyGnat

+0

http://www.youtube.com/watch?v=QUuQ-BdHflk - तेज़ आगे 2:08 है जो मैंने किया था। – PeskyGnat

उत्तर

3

मैं सिर्फ निम्नलिखित तर्क के साथ यहां एक जंगली शॉट लेने के लिए, जा रहा हूँ:

संकलन MSVC के सी के दौरान ++ संकलक देखता extern "C" functionTestMe() एक वर्ग Polygon के अंदर एक समारोह Test() बुला रहा है। Polygon कंपाइलर के लिए एक अपूर्ण प्रकार है। मुझे लगता है कि संकलक यह नहीं देख सकता कि फ़ंक्शन Polygon::Test(3) एक अधूरा प्रकार लौटा रहा है या कुछ भी वापस कर रहा है, यह निर्णय लेता है कि उस बिंदु पर एक त्रुटि को वापस करने की आवश्यकता है यदि प्रकार एक सादा सी-शैली पीओडी प्रकार न हो।

"लिंकेज सी ++ से अन्य भाषाओं में परिभाषित वस्तुओं के लिए और करने के लिए वस्तुओं में परिभाषित:

ऊपर (7.5/9" लिंकेज विनिर्देशों ") सी ++ मानक का कहना है के रूप में MSVC की ओर से एक उचित धारणा लगता है अन्य भाषाओं से सी ++ कार्यान्वयन-परिभाषित और भाषा-निर्भर है। केवल दो भाषा कार्यान्वयन की ऑब्जेक्ट लेआउट रणनीतियों के समान हैं, ऐसे लिंक को हासिल किया जा सकता है। "

इससे पहले कि आप extern C लिंकेज विनिर्देश को हटा दें या कॉल को एकस्टाइल फ़ंक्शन में बदल दें, तो त्रुटि गायब हो जाएगी।

+0

हां भी दी, और जब मैं पॉलीगॉन :: टेस्ट को बाहरी "सी" के बिना अपने स्वयं के फ़ंक्शन के अंदर लपेटता हूं तो गायब हो जाता है। मैं हेडर फ़ाइलों के लिए इतना उपयोग करता हूं, और यह स्पष्ट नहीं है कि यह अब .NET असेंबली संदर्भ जोड़ने की दुनिया में कैसे काम करता है – PeskyGnat

+0

'पॉलीगॉन 'अधूरा प्रकार नहीं है; सी ++/सीएलआई में, जब एक असेंबली संदर्भ जोड़ा जाता है, तो उस असेंबली में सभी प्रकार पूर्ण होते हैं। – ildjarn

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