首页 > 编程语言 >CLR/C++回调函数callback和C# delegate的互相转换

CLR/C++回调函数callback和C# delegate的互相转换

时间:2023-12-25 15:38:17浏览次数:42  
标签:函数 C# C++ callback Handler 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(pter.ToPointer());
//应用回调
setCallback(ipc);

场景二:
//从非托管C++ 函数ipc转换为IntPtr
IntPtr pmter = static_cast(ipc);
//从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/

标签:函数,C#,C++,callback,Handler,delegate,回调
From: https://www.cnblogs.com/fanlf/p/17926165.html

相关文章

  • 记一次由于所换证明书不当,导致apahce启动不起来
    背景提要由于要做APP审查,网站证明书过期,请同事更新下证明书,更新完证明书,apache不能重启了重启所报错误[root@xxx~]#systemctlstarthttpd.serviceJobforhttpd.servicefailedbecausethecontrolprocessexitedwitherrorcode.See"systemctlstatushttpd.servi......
  • Cost Calculator Builder PRO v3.1.46 已注册 – WordPress 插件
    成本计算器生成器PROv3.1.46:WordPress插件全解析一、插件概述"成本计算器生成器PROv3.1.46"是一款强大的WordPress插件,专为需要创建报价、价格和项目估算表的用户设计。这款插件集成了众多高级功能,可帮助用户高效地管理他们的成本和价格,从而提供准确的报价估算。二、条......
  • [转]Spring Security 中默认使用的 BCryptPasswordEncoder 密码加盐
    原文地址:SpringSecurityBCryptPasswordEncoder密码加盐_bcryptpasswordencoder加盐-CSDN博客引入spring-boot-starter-security的Jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security......
  • 青少年CTF-qsnctf-Web-eval
    题目环境:<br/>出题人:末心题目难度:★题目描述:Eval是个什么呢,flag格式为:qsnctf{xxx}。做道末心师傅出的题啦......
  • 电子秤方案主控芯片SIC8833的技术应用
    电子秤是一种利用电子技术实现物体重量测量的设备。它是现代生活中不可缺少的日常用品之一。本文将从产品介绍、结构设计、工作原理、功能设计和特点优势五个方面来介绍电子秤方案产品。首先,电子秤方案的产品介绍。电子秤是一种便携式的设备,由主体、显示屏和称量平......
  • Flutter Icons交错动画
    import'package:flutter/material.dart';classAnimateIconsextendsStatelessWidget{constAnimateIcons({super.key});@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(�......
  • Highcharts-Stock 的技术指标配置​
    需求技术指标是用来更好的查看股票数据及做决策的强大工具,一般是基于现有股票数据按照一定的数学公式进行运算,从而创建股价边界或走势,方便做分析和决策。技术指标相关的功能是以数据列的形式实现的,这也就意味着大部分数据列配置也可以在技术指标中使用,唯一需要注意的是技术指标数......
  • 无涯教程-PostgreSQL - Locks(锁)
    排他锁或写锁可防止用户修改行或整个表,然后,在事务期间,由UPDATE和DELETE修改的行将被自动锁定,这样可以防止其他用户更改行,直到事务被提交或回滚为止。用户必须等待其他用户的唯一时间是他们尝试修改同一行时,如果他们修改不同的行,则无需等待,SELECT查询永远不必等待。数据库自动......
  • Excel只替换某列的数据
    使用Excel时会遇到这种情况,可以选中某列,然后可以按Ctrl+F只查找这一列的内容,但是按Ctrl+H替换时确无法直接替换这一列的内容。下面介绍下如何操作能替换某些范围的内容示例介绍:工作簿表格中存在多个数字1,如果我想把所有1替换成其他内容可以用查找/替换简单的完成,但是现在......
  • Elasticsearch 创建索引
    使用Elasticsearch创建索引步骤:打开Elasticsearch的命令行工具(如cURL或Elasticsearch提供的Kibana工具)或集成开发环境(如Elasticsearch的官方客户端库或第三方客户端库)。使用HTTP请求的PUT方法创建索引。需要指定索引的名称,以简单的字符串表示。使用以下命令创建名......