在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
说:
调用是内部的,也就是说,它调用的是在公共语言运行库中实现的方法。
指定方法实现由运行时提供。
但是,如果我理解正确,这两种说法都不正确。根据 MSDN,IShellItem
在shell32.dll中实现。shell32.dll不是 CLR 的一部分。有趣的是,并非所有方法都有MethodImplAttribute
. IShellFolder
做,IShellLinkW
不做,IShellLibrary
不做,IPersistStream
不做等等。
为什么MethodImplAttribute
应用于某些 COM Interop 接口?在这种情况下是什么意思,它如何修改互操作的行为?