栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity使用的C++动态库回调C#函数

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity使用的C++动态库回调C#函数

Unity使用的C++动态库回调C#函数
    • 引言
    • C++
    • C#
    • 参考链接

引言

之前分享了一个文章:Unity显示C++动态库中的Log,其中使用到的主要能力就是,由C++动态库回调C#函数达到的。
这里我再对该功能进行专门的记录,并使用上面的这个文章做例子。

C++

首先,C++动态库中,先声明一个函数指针。

typedef void (*Log)(char* message, int iSize);

接着声明一下该指针类型的变量。

Log g_log;

如果需要将从C#传过来的函数地址全局保存,让其他的类都可以用这个回调函数,所以其他需要用到回调函数的ccp文件里,就需要再声明一次。

extern Log g_log;

然后就是导出一个接口,用来注册设置C#的函数地址。
头文件:

#ifndef DLL_API
#define DLL_API extern "C"
#endif

DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize));

源文件:

DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize))
{
	g_log = Log;
}

这样,源文件的任何位置,当需要回调C#的函数时,只要调g_log就可以了。

g_log(acLogStr, strlen(acLogStr));
C#

下面就是C#的代码,在C#中是由函数的委托来代替函数指针的。故代码如下。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void LogDelegate(IntPtr message, int iSize);
[DllImport("mac", CallingConvention = CallingConvention.Cdecl)]
public static extern void InitCSharpDelegate(LogDelegate log);
[MonoPInvokeCallback(typeof(LogDelegate))]
public static void LogMessageFromCpp(IntPtr message, int iSize)
{
    Debug.Log(Marshal.PtrToStringAnsi(message, iSize));
}
public static void ShowLog()
{
    InitCSharpDelegate(LogMessageFromCpp);
}

现在,只需要在C#代码中调用ShowLog静态函数(设置注册回调)之后,C++动态库就能回调C#端的函数了。
完整的代码示例在文章Unity显示C++动态库中的Log中,但有些差别,可以一起对照查看。

参考链接

https://blog.csdn.net/u011414997/article/details/50574434

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900743.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号