.NET9 FCall/QCall调用约定
💡
原文中文,约3600字,阅读约需9分钟。
📝
内容提要
FCall/Qcall是托管与非托管之间的调用约定,双方需要一个契约,以弥合彼此的互相/单向调用。FCall用于托管调用非托管函数,而QCall用于托管调用非托管导出函数。
🎯
关键要点
- FCall/Qcall是托管与非托管之间的调用约定。
- 非托管调用约定有四种:thiscall、stdcall、cdecl、fastcall。
- thiscall使用特定寄存器传递当前类指针,堆栈由自身清理。
- stdcall一般用于win32 API,自身清理堆栈,从右往左传参。
- cdecl调用者清理堆栈,从右往左传参,常用于MFC框架。
- fastcall通过寄存器传递前几个参数,剩余参数用栈传递。
- FCall用于托管调用非托管函数,确保双方有约定以保持一致性。
- FCall通过宏定义重新排序参数和返回值。
- FCIMPL宏定义用于实现FCall,确保调用约定正确。
- QCall用于托管调用非托管导出函数,遵循平台标准。
- FCall是托管调用非托管的约定,QCall用于非托管导出的函数调用。
❓
延伸问答
FCall和QCall的主要区别是什么?
FCall用于托管调用非托管函数,而QCall用于托管调用非托管导出函数。
非托管调用约定有哪些类型?
非托管调用约定有四种:thiscall、stdcall、cdecl和fastcall。
FCall是如何确保调用约定正确的?
FCall通过宏定义重新排序参数和返回值,确保调用约定的正确性。
什么是FCIMPL宏定义,它的作用是什么?
FCIMPL宏定义用于实现FCall,确保调用约定正确并处理参数的顺序。
stdcall调用约定的特点是什么?
stdcall一般用于win32 API,自身清理堆栈,从右往左传递参数。
QCall是如何在托管代码中使用的?
QCall一般使用导出标记extern,遵循平台标准进行托管调用非托管导出函数。
🏷️
标签
➡️