MethodImplAttribute(InternalCall, Runtime) 对 COM 互操作接口的方法做了什

本文关键字:接口 方法 互操作 COM InternalCall Runtime MethodImplAttribute | 更新日期: 2023-09-27 18:34:22

在Windows API Code Pack for .NET Framework中,许多COM互操作接口的方法都用MethodImplAttribute装饰,例如:

internal interface IShellItem
{
    [PreserveSig]
    [MethodImpl(
        MethodImplOptions.InternalCall,
        MethodCodeType = MethodCodeType.Runtime)]
    HResult BindToHandler(
        [In] IntPtr pbc, [In] ref Guid bhid, [In] ref Guid riid,
        [Out, MarshalAs(UnmanagedType.Interface)] out IShellFolder ppv);

MethodImplOptions.InternalCall值的文档说:

调用是内部调用,也就是说,它调用在公共语言运行库中实现的方法。

MethodCodeType.Runtime的文档 说:

指定方法实现由运行时提供。

但是,如果我理解正确,这两种说法都不正确。 根据MSDN的说法,IShellItem是在shell32.dll中实现的。shell32.dll 不是 CLR 的一部分。有趣的是,并非所有方法都有MethodImplAttribute. IShellFolder有,IShellLinkW没有,IShellLibrary有,IPersistStream没有等等。

为什么MethodImplAttribute应用于某些 COM 互操作接口?在这种情况下,这意味着什么,它如何修改互操作的行为?

MethodImplAttribute(InternalCall, Runtime) 对 COM 互操作接口的方法做了什

这只是

Microsoft程序员获取接口声明的方式的副作用。 某些 shell 接口在类型库(如 IShellItem)中可用,因此将它们放入源代码的最简单方法是运行 Tlbimp.exe生成互操作库和反汇编器以将程序集反编译为 C# 代码。 这也带来了Tlbimp.exe生成的额外属性,如[MethodImpl]。

其他接口在类型库中不可用,如IShellLinkW和IPersistStream,也不能从IDL生成类型库,因此程序员别无选择,只能自己键入它们。 他跳过了不必要的东西。

不,[MethodImpl]在这里并不重要。 这些是接口类型,因此无论如何都没有方法。 Tlbimp.exe只是对此并不十分复杂。

相关文章: