gpt4 book ai didi

c# - 字段上的 PInvoke 实现

转载 作者:太空狗 更新时间:2023-10-29 22:30:39 25 4
gpt4 key购买 nike

所以今天我浏览 ILSpy 以更好地了解 .NET 如何对外部方法执行 DllImports,当我遇到一些奇怪的事情时:

在搜索对 System.Reflection.MethodAttributes 枚举中定义的枚举值 PInvokeImpl 的引用时,我注意到 System.反射.FieldAttributes.

果然,这似乎不仅仅是在幕后重复使用枚举值:System.Reflection.FieldInfo 有一个公开定义的属性,名为 IsPinvokeImpl ,它专门检查是否设置了此实现标志。

有趣的是,MethodInfo 类甚至没有这个属性 - 它必须由 MethodImplementationFlags 属性来确定。

问题:

字段是否真的有可能被 PInvoke 实现,或者这只是 .NET 框架中的 stub 实现,以平衡字段修饰和方法修饰?

如果可以的话,可以用C#实现吗,还是这个功能需要C++/CLI?

最佳答案

当您查看 FieldAttributes 的 MSDN 描述时,您会看到它被记录为“保留供将来使用”。那个 future 还没有到来,所以它的意图还没有确定。

像 FieldAttributes 这样的类型不是任意的,它们遵循 CLI 规范。 Ecma-335确定 .NET 程序集中的元数据需要是什么样子以及应该如何解释它。这份文件确实揭示了一个有趣的怪癖。

第 II.16.1 章描述了字段属性,您将看到元数据标记和 FieldAttributes 枚举之间的紧密匹配。但是请注意,pinvokeimpl 在该章中缺失

第II.23.1.5章给出了属性的具体取值,它有值为0x2000的PInvokeImpl。描述是“通过 PInvoke 转发实现”。与 II.23.1.10 相比,描述了方法属性。它有许多与字段属性相同的值。

这看起来很像复制/粘贴错误:)

深入挖掘 .NET Framework 源代码,CLR 和抖动只考虑方法上的 pinvokeimpl。然而,C# 编译器似乎基于 CLI 规范并实际设置了属性。出现在 emit.cpp 中,RegMeta::_DefinePinvokeMap() 函数,如果为字段而不是方法调用此函数,它将设置属性。这从未真正发生过。

关于c# - 字段上的 PInvoke 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30620712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com