8

Windows API Code Pack for .NET Framework中,COM Interop 接口的许多方法都用 装饰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,IShellItemshell32.dll中实现。shell32.dll不是 CLR 的一部分。有趣的是,并非所有方法都有MethodImplAttribute. IShellFolder做,IShellLinkW不做,IShellLibrary不做,IPersistStream不做等等。

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

4

1 回答 1

11

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

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

不,[MethodImpl] 在这里并不重要。这些是接口类型,所以无论如何都没有方法。Tlbimp.exe 并不是非常复杂。

于 2013-10-08T21:05:32.240 回答