Czy można wywołać funkcję rzucania C# z wywołania C++ w aplikacji C#, tak aby stos C++ został odpowiednio rozwinięty? Czy jest jakaś dokumentacja tego?Jak wywołać funkcję C# z C++ w aplikacji C#, tak aby stos C++ został odpowiednio rozwinięty?
Na przykład, należy rozważyć ten kod 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);
}
Wraz z tym C++ Kod:
void CppFunc(void (*handler))
{
SomeResourceWrappingClass releasesResourceOnDestruction();
handler();
}
Próbowałem to uwagę, a C# wyjątek został złapany pomyślnie, ale releasesResourceOnDestruction nie zrobił” t ma wywoływany destruktor. Wydaje się to wskazywać, że stos C++ nie jest odpowiednio rozwijany - czy można go tutaj odpowiednio odpiąć? Czy istnieje dokumentacja dotycząca tego zachowania?
Dla kontekstu: Chcę czasami wyzwalać wyjątek C# z kodu C++, jeśli to możliwe, tak, że nie potrzebuję każdego wywołania z C# do C++, muszę coś sprawdzić później, aby sprawdzić, czy wyjątek C# musi zostać zgłoszony.
Skąd wiesz, że destruktor 'releasesResourceOnDestruction' nie został wywołany? – 101010
Konieczne będzie wyłączenie optymalizacji używanej przez kompilator C++, gdy nie zostanie wyświetlony wyjątek C++. Project + Properties, C/C++, Generowanie kodu, Włącz C++ Exceptions =/EHa. Faktycznie wychwycenie wyjątku wymaga użycia niestandardowego __try/__ oprócz słów kluczowych. Jest * bardzo * mało sensowne, co możesz zrobić, wszystkie informacje potrzebne do zdiagnozowania wyjątku zostały utracone. To będzie pomocna rozmowa telefoniczna od użytkownika, który jest ciężko odpowiedzieć. –
40two: Dodałem instrukcję drukowania zarówno do konstruktora, jak i destruktora wydaniaResourceOnDestruction. Contructor drukuje, ale destruktor nigdy tego nie robi. – JDiMatteo