【游戏引擎 - 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);

相关推荐

  1. 游戏引擎 - C#脚本系统6C#调用C++函数

    2023-12-09 05:38:03       53 阅读
  2. C程序调用C++函数,以及C++调用C函数

    2023-12-09 05:38:03       27 阅读
  3. Android调用C++函数

    2023-12-09 05:38:03       32 阅读
  4. 游戏辅助从0到1-C++调用游戏Lua脚本实现辅助

    2023-12-09 05:38:03       73 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 05:38:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 05:38:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 05:38:03       82 阅读
  4. Python语言-面向对象

    2023-12-09 05:38:03       91 阅读

热门阅读

  1. 旅游产品经理常用的ChatGPT通用提示词模板

    2023-12-09 05:38:03       51 阅读
  2. 硬件产品经理常用的ChatGPT通用提示词模板

    2023-12-09 05:38:03       55 阅读
  3. 麒麟V10服务器安装Apache+PHP

    2023-12-09 05:38:03       48 阅读
  4. 华为、华三、锐捷、思科巡检命令大全

    2023-12-09 05:38:03       144 阅读
  5. nodejs发起http或https请求

    2023-12-09 05:38:03       58 阅读
  6. Swagger提示请确保swagger资源接口正确

    2023-12-09 05:38:03       62 阅读
  7. http和https区别

    2023-12-09 05:38:03       58 阅读
  8. TCP通讯

    TCP通讯

    2023-12-09 05:38:03      52 阅读
  9. Golang优雅实现按比例切分流量

    2023-12-09 05:38:03       55 阅读