C # C ++ Interop callback

Недавно я возился с взаимодействием между C # и C ++, в частности настраивая функцию обратного вызова, которая вызывается из C ++ DLL.

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;
        }
    }
}

У меня такой вопрос, что когда программный элемент управления входит в функцию TomCallback, я ожидал, что он затем выполнит цикл while (true) в Main. Однако вместо этого программа просто выходит. Я не могу полностью разобраться в поведении, часть меня воображает, что это то, что ожидалось, но часть меня ожидала, что оно продолжится в основном.

Чего я ожидал ...

The GetData() function is called The GetData function calls the callback The callback function returns back to GetData GetData returns back to main()

Однако это не совсем верно.

Будет ли кто-то достаточно любезен, чтобы объяснить, что происходит.

Чтобы сэкономить место, я не разместил неуправляемый код, однако, если это необходимо, я рад опубликовать

Edit: Я включил неуправляемую отладку (совсем забыл это сделать) и теперь вижу сбой ..

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Нативный код, так как именно здесь происходит сбой

#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);
}

Ответы на вопрос(2)

Ваш ответ на вопрос