世界上有很多方法.Net库是用本机代码实现的.来自框架本身的标记为[MethodImpl(MethodImplOptions.InternalCall)].来自某个非托管DLL的标记为[DllImport](例如[DllImport("kernel32.dll")]).到目前为止没有什么不寻常的.

但是在写answer for another question的时候,我发现有很多标有[DllImport("QCall")]的方法.它们似乎是.Net(例如GC._Collect())的内部实现.

我的问题是:[DllImport("QCall")]到底是什么意思?[DllImport("QCall")][MethodImpl(MethodImplOptions.InternalCall)]有什么区别?

推荐答案

这是一条旧线.因为CoreCLR现在在GitHub上是开源的;如果有人还在寻找答案,这里是official documentation个:

Calling from managed to native code

我们有两种从托管代码调入CLR的技术.FCall允许您直接调用CLR代码,并在操作对象方面提供了很大的灵活性,尽管没有正确跟踪对象引用很容易导致GC漏洞.QCall允许您通过P/Invoke调用CLR,并且比FCall更难意外误用.在托管代码中,FCall被标识为设置了MethodImplOptions.InternalCall位的外部方法.QCall是静电的外部方法,看起来像常规的P/Invoke,但是对于一个名为"QCall"的库来说.

FCall的一个小变体称为HCall(用于Helper调用),用于实现JIT helpers,用于访问多维数组元素、范围判断等.HCall和FCall之间的唯一区别是HCall方法不会出现在异常堆栈跟踪中.

然后在副标题中继续:

举例说明:

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

在 .NET 中使用 AES 解密时缺少后半字节

AsyncLocal 的语义与逻辑调用上下文有何不同?

将字符串与容差进行比较

lock() 是否保证按请求的顺序获得?

在c#中计算中位数

在 WinForms 应用程序中查找焦点控件的首选方法是什么?

使用 Task.Factory.StartNew 传递方法参数

如何从 .net 中的数组类型获取数组项类型

无法在 Windows 10 上安装 Windows SDK 7.1

如何将 XPath 与 XElement 或 LINQ 一起使用?

.Net 中 AOP 的最佳实现是什么?

将记录器作为单身人士是一个好习惯吗?

判断 .NET 中的目录和文件写入权限

获取系统中已安装的应用程序

使 HashSet 不区分大小写

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

合并两个(或更多)PDF

LINQ 可以与 IEnumerable 一起使用吗?