CLR/C++回调函数callback和C# delegate的互相转换
在进行CLR/C++进行开发的时候会经常遇到C++回调函数和C#的delegate之间的相互转换,例如在C++非托管类型的代码中的回调函数需要使用C#类的函数,或者是在C#代码中需要使用非托管C++的函数,这时候就需要在回调函数和delegate代理之间进行转换。
C++:
回调函数:
typedef void (*pfunc)(int);
调用函数:
void setCallback(pfunc func)
{
func(100);
}
C#:
public delegate void Handler(int);
ref class HandlerClass
{
public:
void HandlerFunc1(int v)
{
Console::WriteLine("class func:{0}",v);
}
static void HandlerFunc2(int v)
{
Console::WriteLine("class static func:{0}", v);
}
};
场景一:
setCallBack()使用C#的类函数:
Handler^ pHandler1 = gcnew Handler(&HandlerClass::HandlerFunc2);//静态函数方法
HandlerClass^ op = gcnew HandlerClass;
Handler^ pHandler2 = gcnew Handler(op, &HandlerClass::HandlerFunc1);//类成员函数
//从托管代码获取函数回调
IntPtr pter= Marshal::GetFunctionPointerForDelegate(pHandler1);
//转换为函数回调
pfunc ipc = static_cast
//应用回调
setCallback(ipc);
场景二:
//从非托管C++ 函数ipc转换为IntPtr
IntPtr pmter = static_cast
//从IntPtr获取C#的delegate代理
auto del= Marshal::GetDelegateForFunctionPointer(pmter, pHandler1->GetType());
//将代理转换为目标的delegate代理
Handler^ mdel = static_cast<Handler^>(del);
//调用代理delegate
if (mdel)
{
mdel(2300);
}
转自https://www.bilibili.com/read/cv24345788/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能