क्या सी # एप में सी ++ कॉल से फेंकने वाला सी # फ़ंक्शन कॉल करना संभव है जैसे सी ++ स्टैक ठीक से अवांछित है? क्या इसका कोई दस्तावेज है?सी #+ में सी ++ से फेंकने वाले सी # फ़ंक्शन को कैसे कॉल करें, जैसे कि 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 नहीं था ' टी इसे विनाशक कहा जाता है। ऐसा लगता है कि सी ++ स्टैक ठीक से अवांछित नहीं हो रहा है - क्या इसे यहां ठीक से खोलना संभव है? क्या इस व्यवहार पर कोई दस्तावेज है?
संदर्भ के लिए: मैं कभी-कभी सी ++ कोड से सी # अपवाद को ट्रिगर करना चाहता हूं, इसलिए मुझे सी # में सी ++ से प्रत्येक कॉल की आवश्यकता नहीं है, यह देखने के लिए कि सी # अपवाद को फेंकने की आवश्यकता है या नहीं।
आप कैसे जानते हैं कि 'रिलीज संसाधनों के विनाश' के विनाशक को विकसित नहीं किया गया था? – 101010
आपको एक ऑप्टिमाइज़ेशन को अक्षम करना होगा जिसे C++ कंपाइलर उपयोग करता है जब उसे C++ अपवाद फेंक नहीं दिया जाता है। परियोजना + गुण, सी/सी ++, कोड जनरेशन, सी ++ अपवाद =/ईएचए सक्षम करें। असल में अपवाद को पकड़ने के लिए कीवर्ड को छोड़कर गैर-मानक __try/__ का उपयोग करना आवश्यक है। * बहुत * थोड़ा उचित है जो आप कर सकते हैं, अपवाद का निदान करने के लिए आवश्यक सभी जानकारी खो गई थी। यह एक चुने हुए उपयोगकर्ता से एक समर्थन फोन कॉल होने जा रहा है जो उत्तर देने में बहुत मुश्किल है। –
40two: मैंने रिलीज के निर्माता और विनाशक दोनों को प्रिंटिंग स्टेटमेंट जोड़ा है। स्रोतऑनडिस्ट्रक्शन। रचनाकार प्रिंट करता है लेकिन विनाशक कभी नहीं करता है। – JDiMatteo