找回密码
 立即注册
查看: 153|回复: 2

unity的UnityEngine.dll中extern非static函数是什么道理??

[复制链接]
发表于 2024-7-15 18:53 | 显示全部楼层 |阅读模式


上面截图来自UnityEngine.dll 的 Assetbundle类中的一个函数声明

请问个问题,正常extern的函数都是static的,但在unity的UnityEngine.dll中extern非static函数是什么道理??还有请问下 [WrapperlessIcall, TypeInferenceRule(TypeInferenceRules.TypeReferencedBySecondArgument)]、[MethodImpl(MethodImplOptions.InternalCall)]  这些属性分袂暗示什么意思的?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 18:53 | 显示全部楼层
我最近也在研究Mono,似乎可以回答一下这个问题的一部分。
在Mono的C#代码中被标记了[MethodImpl(MethodImplOptions.InternalCall)]的函数的实现部分是在C++中的,需要使用mono_add_internal_call来添加C#函数和C++函数的对应关系,C++中的函数需要是static或者全局函数,但是C#中的函数并没有要求一定要static,我自己试了一下,非static函数会有一个默认参数,这个参数是MonoObject* 类型的,传递的应该是这个C#类的this引用,显式声明的参数都会在这个参数后面被传递,static函数就不会有这个默认的参数,个人觉得这个类似于lua中调用函数使用点还是冒号的区别。更多的东西我也还没有看到,回答的不对的地方还望指正,希望对题主有所帮助!
发表于 2024-7-15 18:53 | 显示全部楼层
Unity大部分功能都是C++实现的,C#的API只是一个wrapper。InternalCall表示这个函数的实现由runtime提供。
自己host mono runtime的话可以通过mono_add_internal_call把native实现注入进去。具体参考 http://www.mono-project.com/docs/advanced/embedding/
所以调用这些函数其实就是调用Unity的native API,代码是不会让你看到的。但是没有Unity源码又想搞清楚里面在干什么怎么办呢?其实有大招。
不知道为什么,Windows版的Unity附带了全套native代码的pdb,而且是private的,在安装目录就能找到。这样自己建一个Symbol Store,然后挂上WinDbg就可以开心地调试Unity的内部结构了。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-8 09:32 , Processed in 0.066839 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表