2014-09-09 5 views
5

क्या सी # एप में सी ++ कॉल से फेंकने वाला सी # फ़ंक्शन कॉल करना संभव है जैसे सी ++ स्टैक ठीक से अवांछित है? क्या इसका कोई दस्तावेज है?सी #+ में सी ++ से फेंकने वाले सी # फ़ंक्शन को कैसे कॉल करें, जैसे कि C++ स्टैक ठीक से अवांछित है?

उदाहरण के लिए, इस सी # कोड पर विचार करें:

using System; 

public class Test 
{ 
    public static void CalledFromCpp() 
    { 
     throw new Exception("Is this safe? Is C++ stack unwound properly?"); 
    } 

    public static void Main() 
    { 
     try { 
      CppFunc(CalledFromCpp); 
     } 
     catch(Exception e) 
     { 
      Console.Writeline("Exception e: {0}", e); 
     } 
    } 

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
    delegate void CsFuncToBeCalledFromCpp(); 

    [DllImport("CppApp", CallingConvention = CallingConvention.Cdecl)] 
    private static extern void 
    CppFunc(CsFuncToBeCalledFromCpp callback); 
} 

इस सी के साथ-साथ ++ कोड:

void CppFunc(void (*handler)) 
{ 
    SomeResourceWrappingClass releasesResourceOnDestruction(); 
    handler(); 
} 

मैं इस बाहर की कोशिश की, और सी # अपवाद सफलतापूर्वक पकड़ा गया था, लेकिन releasesResourceOnDestruction नहीं था ' टी इसे विनाशक कहा जाता है। ऐसा लगता है कि सी ++ स्टैक ठीक से अवांछित नहीं हो रहा है - क्या इसे यहां ठीक से खोलना संभव है? क्या इस व्यवहार पर कोई दस्तावेज है?

संदर्भ के लिए: मैं कभी-कभी सी ++ कोड से सी # अपवाद को ट्रिगर करना चाहता हूं, इसलिए मुझे सी # में सी ++ से प्रत्येक कॉल की आवश्यकता नहीं है, यह देखने के लिए कि सी # अपवाद को फेंकने की आवश्यकता है या नहीं।

+0

आप कैसे जानते हैं कि 'रिलीज संसाधनों के विनाश' के विनाशक को विकसित नहीं किया गया था? – 101010

+0

आपको एक ऑप्टिमाइज़ेशन को अक्षम करना होगा जिसे C++ कंपाइलर उपयोग करता है जब उसे C++ अपवाद फेंक नहीं दिया जाता है। परियोजना + गुण, सी/सी ++, कोड जनरेशन, सी ++ अपवाद =/ईएचए सक्षम करें। असल में अपवाद को पकड़ने के लिए कीवर्ड को छोड़कर गैर-मानक __try/__ का उपयोग करना आवश्यक है। * बहुत * थोड़ा उचित है जो आप कर सकते हैं, अपवाद का निदान करने के लिए आवश्यक सभी जानकारी खो गई थी। यह एक चुने हुए उपयोगकर्ता से एक समर्थन फोन कॉल होने जा रहा है जो उत्तर देने में बहुत मुश्किल है। –

+0

40two: मैंने रिलीज के निर्माता और विनाशक दोनों को प्रिंटिंग स्टेटमेंट जोड़ा है। स्रोतऑनडिस्ट्रक्शन। रचनाकार प्रिंट करता है लेकिन विनाशक कभी नहीं करता है। – JDiMatteo

उत्तर

2

अपने सी ++ प्रोजेक्ट (प्रोजेक्ट प्रॉपर्टीज -> सी/सी ++ -> कोड जेनरेशन -> सी ++ अपवादों को सक्षम करें -> "एसईएच अपवादों (/ ईएचए) के साथ हाँ") में संरचित अपवाद हैंडलिंग को सक्षम करने का प्रयास करें। एसईएच अपवादों के बिना, सी ++ परत पर वापस आने वाले अपवाद में स्टैक को ठीक से खोलने के लिए पर्याप्त जानकारी नहीं है।

+1

सी ++ अपवादों के तहत कई विकल्प हैं। "एसईएच अपवाद (/ ईएचए) के साथ हाँ" को चुनने की जरूरत है। – Velox

+1

वेलॉक्स, क्या आप इस दृष्टिकोण के साथ कोई संभावित समस्याएं देखते हैं? दूसरे जवाब ने सुझाव दिया कि अगर अपवाद नहीं पकड़ा गया तो विषम चीजें होती हैं। इसके अलावा, कृपया अपने उत्तर में अपनी टिप्पणी में "/ EHa" के बारे में अपनी स्पष्टीकरण को स्थानांतरित करने पर विचार करें। – JDiMatteo

+1

समस्याएं जो मैं इस दृष्टिकोण से देखता हूं: 1 - आपको अपवाद को पकड़ने के लिए एक पकड़ खंड होना होगा, अन्यथा अनचाहे अपवाद के कारण आपका प्रोग्राम क्रैश हो जाएगा। 2 - चूंकि यह एक सी # अपवाद फेंक दिया गया है, इसलिए आपको सटीक अपवाद को पकड़ने में परेशानी होगी। अपवाद को पकड़ने के लिए आपको शायद 'पकड़ (...) 'की आवश्यकता होगी। – Velox

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