MethodImplAttribute(InternalCall, Runtime) 对 COM Interop 接口的方法有何作用?

2024-04-06

In .NET Framework 的 Windows API 代码包 http://archive.msdn.microsoft.com/WindowsAPICodePack,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 http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx值 说:

该调用是内部调用,即调用公共语言运行时内实现的方法。

文档MethodCodeType.Runtime http://msdn.microsoft.com/en-us/library/4k10sb5f.aspx says:

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

但是,如果我理解正确的话,这两种说法都不正确。IShellItem实施于shell32.dll http://msdn.microsoft.com/en-us/library/windows/desktop/bb761144%28v=vs.85%29.aspx,根据 MSDN。shell32.dll不是 CLR 的一部分。有趣的是,并非所有方法都有MethodImplAttribute. IShellFolder does, IShellLinkW没有,IShellLibrary does, IPersistStream不等。

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


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MethodImplAttribute(InternalCall, Runtime) 对 COM Interop 接口的方法有何作用? 的相关文章

随机推荐