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

强烈建议阅读Mono官方文档

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

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

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

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

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

注册Internal call

c 复制代码
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:

c 复制代码
using System;
using System.Runtime.CompilerServices;	// 必要头文件

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

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

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

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

注册internal call 应该:

c 复制代码
mono_add_internal_call("Happy.Hello::CppFunction", CppFunc);
相关推荐
波力海苔夹心脆67515 分钟前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
xlq223221 小时前
全面复习4
c++
殷色玫瑰1 小时前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
Tri_Function1 小时前
背包:从入门到实战
c++
j7~1 小时前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
Lazionr2 小时前
unordered_map和unordered_set的使用
开发语言·c++·算法
进化中的刀盾兽2 小时前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
Behavior2 小时前
国内下载使用 Unity 6000 踩坑点总结
c#·unity3d·游戏开发
HZY1618yzh2 小时前
下一代编程语言出炉
c++·算法