Обратный вызов взаимодействия C# C++

Недавно я возился с взаимодействием 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. Однако вместо этого программа просто завершает работу. Я не могу понять поведение, часть меня воображает, что это так, как и ожидалось, но часть меня ожидала, что это продолжится в основном.

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

  1. Вызывается функция GetData()
  2. Функция GetData вызывает обратный вызов
  3. Функция обратного вызова возвращается обратно в GetData
  4. GetData возвращается обратно в main()

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

Не мог бы кто-нибудь объяснить, что происходит.

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

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

Ошибка проверки во время выполнения #0 — значение ESP не было должным образом сохранено при вызове функции. Обычно это результат вызова функции, объявленной с одним соглашением о вызовах, с указателем на функцию, объявленным с другим соглашением о вызовах.

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

#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);
}
8
задан jszigeti 13 February 2013 в 14:50
поделиться