C # C ++ Interop-Rückruf

Ich habe in letzter Zeit an C # zu C ++ Interop herumgebastelt und insbesondere eine Rückruffunktion eingerichtet, die von der C ++ - DLL aufgerufen wird.

namespace TomCSharpDLLImport
{
    class Program
    {
        public delegate void TomDelegate(int a, int b);

        [DllImport("TomDllNative.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void GetData();

        [DllImport("TomDllNative.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void SetCallback(TomDelegate aCallback);

        static void Main(string[] args)
        {
            TomDelegate lTD = new TomDelegate(Program.TomCallback);

            SetCallback(lTD); //Sets up the callback

            int thread = Thread.CurrentThread.ManagedThreadId;

            GetData(); //This calls the callback in unmanaged code

            while (true) ;
        }

        //Callback function which is called from the unmanaged code
        public static void TomCallback(int a, int b)
        {
            Console.WriteLine("A: {0} B: {1}", a, b);
            int thread = Thread.CurrentThread.ManagedThreadId;
        }
    }
}

Die Frage, die ich habe, ist, dass, als die Programmsteuerung in die TomCallback-Funktion eintritt, erwartet wurde, dass sie dann die while (true) -Schleife in Main trifft. Stattdessen wird das Programm jedoch gerade beendet. Ich kann mich nicht so recht mit dem Verhalten auseinandersetzen, ein Teil von mir stellt sich das wie erwartet vor, aber ein Teil von mir hätte erwartet, dass es im Wesentlichen so weitergeht.

Was ich erwartet hatte ...

Die GetData () - Funktion wird aufgerufenDie GetData-Funktion ruft den Rückruf aufDie Rückruffunktion kehrt zu GetData zurückGetData kehrt zurück zu main ()

Dies ist jedoch nicht ganz richtig.

Wäre jemand so freundlich zu erklären, was passiert?

Um Platz zu sparen, habe ich den nicht verwalteten Code nicht gepostet. Wenn er jedoch benötigt wird, kann ich ihn gerne posten

Bearbeiten: Ich habe das nicht verwaltete Debugging aktiviert (habe dies völlig vergessen) und jetzt sehe ich den Absturz.

Run-Time Check Failure # 0 - Der Wert von ESP wurde während eines Funktionsaufrufs nicht ordnungsgemäß gespeichert. Dies ist normalerweise das Ergebnis des Aufrufs einer Funktion, die mit einer Aufrufkonvention deklariert wurde, und eines Funktionszeigers, der mit einer anderen Aufrufkonvention deklariert wurde.

Nativer Code, da hier Abstürze auftreten

#include "stdafx.h"
typedef void (*callback_function)(int, int);

extern "C" __declspec(dllexport) void SetCallback(callback_function aCallback);
extern "C" __declspec(dllexport) void GetData();

callback_function gCBF;

__declspec(dllexport) void SetCallback(callback_function aCallback)
{
    gCBF = aCallback;
}

__declspec(dllexport) void GetData()
{
    gCBF(1, 2);
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage