0x00 引言

再简单的事情,也需要有人去做。

0x01 函数指针

C语言的回调函数主要通过函数指针的方式实现,相关主要代码如下:

typedef void(*CallbackFunc)(int mes_length);

void callback(int mes_length)  // 回调函数
{
	std::cout << mes_length <<std::endl;
}

extern "C" void __declspec(dllimport) SetReadCallback(CallbackFunc callback) // 调用函数
{
	int length = 0;
	callback(length);
}

int main(int argc,char* argv[])  // 实现函数回调
{
    SetReadCallback(callback);
    return 0;
}

0x02 C调用

void callback(int mes_length)
{
	std::cout << mes_length <<std::endl;
}

int main()
{
	SetReadCallback(callback);
	return 0;
}

0x03 C#调用

C#这边主要通过委托(delegate)来实现,具体代码如下:

using System.Runtime.InteropServices;

namespace Test
{
    class Program
    {
		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		public delegate void CallbackFunc(int mes_length);

		[DllImport(@"test.dll", EntryPoint = "CCasicDDSCtrl2ModelSubscriberSharpSetCallback", 
			SetLastError = true,CharSet = CharSet.Unicode, ExactSpelling = false, 
			CallingConvention = CallingConvention.Cdecl)]
			extern static bool SetReadCallback(CallbackFunc callback);

		static void Main(string[] args)
		{
			SetReadCallback(Program.CsharpCallback);
		}

		public static void CsharpCallback(int mes_length)
		{
			Console.WriteLine(mes_length);
		}

	}
}

0x04 UPDATE

2019-02-19