Недавно я возился с взаимодействием 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. Однако вместо этого программа просто завершает работу. Я не могу понять поведение, часть меня воображает, что это так, как и ожидалось, но часть меня ожидала, что это продолжится в основном.
Чего я и ожидал...
. Однако это не совсем так.
Не мог бы кто-нибудь объяснить, что происходит.
В целях экономии места я не публиковал неуправляемый код, однако, если он необходим, я с удовольствием опубликую
Изменить: Я включил неуправляемую отладку (полностью забыл это сделать) и теперь вижу сбой.
Ошибка проверки во время выполнения #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);
}