MethodImplAttribute(InternalCall,Runtime)对COM Interop接口的方法做了什么?

时间:2013-10-08 17:12:58

标签: c# .net com com-interop

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,IShellItem is implemented in shell32.dll shell32.dll 不是CLR的一部分。有趣的是,并非所有方法都有MethodImplAttributeIShellFolder确实如此,IShellLinkW没有,IShellLibrary没有,IPersistStream没有等等。

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

1 个答案:

答案 0 :(得分:9)

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

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

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