当前位置: 首页 > article >正文

【游戏引擎 - C#脚本系统】6、C#端调用C++函数

强烈建议阅读Mono官方文档

有mono库提供的API,这个过程非常简单,通过mono在C++中注册函数,然后在C#中声明和调用这些函数

1、在C++中注册Internal Call:

C++代码中定义一个函数

static void CppFunc() 
{
	std::cout << "这是在C++中实现的函数\n";
}

这是在C++中实际的函数实现。注意static并非必须,仅仅因为我想让他只在当前编译单元可见而已。

注册Internal call

mono_add_internal_call("Hello::CppFunction", CppFunc);

这一行代码将C函数 sample 注册为内部调用(Internal Call),使得它可以从C#中直接调用。Hello::CppFunction 是注册的名称,表示在C#中调用这个函数时使用的名称。CppFunc 则是实际的C函数名称。

注意,需要在特定的App Domain中注册Internal Call。当调用mono_domain_set来切换到一个新的App Domain时,通常原来的App Domain的所有注册信息都不再有效,因此你需要重新注册Internal Call。

2、在C#中声明Internal Call

using System;
using System.Runtime.CompilerServices;	// 必要头文件

class Hello 
{
	 public Hello()
	 {
		CppFunction();
	 }
	 
	 [MethodImplAttribute(MethodImplOptions.InternalCall)]
	 extern static void CppFunction();
}

在C#中,使用 [MethodImpl(MethodImplOptions.InternalCall)] 特性来声明一个内部调用。这告诉编译器,实际的方法实现是在运行时的C++代码中

如果C#中,类还处于一个命名空间中,那么注册的时候必须给一个完整的路径,这个路径比较奇怪,例如这种情况

namespace Happy
{
	class Hello 
	{
		 public Hello()
		 {
			CppFunction();
		 }
		 
		 [MethodImplAttribute(MethodImplOptions.InternalCall)]
		 extern static void CppFunction();
	}
}

注册internal call 应该:

mono_add_internal_call("Happy.Hello::CppFunction", CppFunc);

http://www.kler.cn/news/163054.html

相关文章:

  • 使用 Axios 进行网络请求的全面指南
  • echart中定义brush,默认状态,触发状态
  • MQTT协议对比TCP网络性能测试模拟弱网测试
  • Mybatis XML改查操作(结合上文)
  • SpringBoot集成WebSocket
  • Redis 基础—Redis Desktop Manager(Redis可视化工具)安装及使用教程
  • 如何使用玻璃材质制作3D钻石模型
  • 【conda】利用Conda创建虚拟环境,Pytorch各版本安装教程(Ubuntu)
  • IO多路转接之select
  • SQL命令---修改数据库的编码
  • 【ChatGLM3】第三代大语言模型多GPU部署指南
  • node14升级node16之后无法启动处理
  • Java编程中通用的正则表达式(二)
  • idea__SpringBoot微服务05——JSR303校验(新注解)(新的依赖),配置文件优先级,多环境切换
  • Mysql 命令行导出SQL文件和导入文件
  • mybatisplus手动获取数据源执行非主数据库事务
  • sql行转列
  • java-两个列表进行比较,判断那些是需要新增的、删除的、和更新的
  • 线性回归与逻辑回归:深入解析机器学习的基石模型
  • LinuxBasicsForHackers笔记 -- 日志系统
  • AGM CPLD 应用指南
  • 《每天一个Linux命令》 -- (5)通过sshkey密钥登录服务器
  • Could not resolve all dependencies for configuration ‘:app:androidApis‘.
  • Amazon CodeWhisperer 开箱初体验
  • JAVA程序如何打jar和war问题解决
  • CentOS系统装机流程
  • 【场景测试用例】上传文件
  • 【数据开发】Hive 多表join中的条件过滤与指定分区
  • ReactNative性能优化实践
  • Azure云WAF服务的CRS规则和DRS规则区别