Ist es möglich, eine C# -Working-Funktion von einem C++ - Aufruf in einer C# -App aufzurufen, so dass der C++ - Stapel ordnungsgemäß abgewickelt wird? Gibt es eine Dokumentation davon?Wie rufen Sie eine C# -Working-Funktion aus C++ in einer C# -App auf, so dass der C++ - Stapel ordnungsgemäß abgewickelt wird?
Zum Beispiel, beachten Sie bitte diesen C# -Code:
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);
}
Zusammen mit diesem C++ Code:
void CppFunc(void (*handler))
{
SomeResourceWrappingClass releasesResourceOnDestruction();
handler();
}
Ich habe versucht, dies aus, und die C# Ausnahme wurde erfolgreich gefangen, aber releasesResourceOnDestruction didn‘ Ich habe es Destruktor genannt. Dies scheint darauf hinzuweisen, dass der C++ - Stack nicht richtig abgewickelt wird - ist es möglich, dass er hier richtig abläuft? Gibt es Dokumentation zu diesem Verhalten?
Für Kontext: Ich möchte manchmal eine C# Ausnahme von C++ - Code auslösen, so dass ich nicht jeden Aufruf von C# in C++ nachher überprüfen muss, um festzustellen, ob eine C# Ausnahme ausgelöst werden muss.
Woher wissen Sie, dass der Destruktor von 'ReleasesResourceOnDestruction' nicht evoziert wurde? – 101010
Sie müssen eine Optimierung deaktivieren, die der C++ - Compiler verwendet, wenn keine C++ - Ausnahme ausgelöst wird. Projekt + Eigenschaften, C/C++, Codegenerierung, C++ Ausnahmen aktivieren =/EHa. Um die Ausnahme abzufangen, müssen die nicht standardmäßigen __try/__-Schlüsselwörter verwendet werden. Es gibt * sehr * wenig vernünftig, was Sie tun können, alle Informationen, die zur Diagnose der Ausnahme benötigt werden, sind verloren gegangen. Das wird ein Support-Telefonanruf von einem abgehakten Benutzer sein, der schrecklich schwer zu beantworten ist. –
40zwei: Ich habe dem Konstruktor und Destruktor von "ReleasesResourceOnDestruction" eine Druckanweisung hinzugefügt. Der Konstruktor druckt, aber der Destruktor tut es nie. – JDiMatteo