c# - interop中文



MethodImplAttribute(InternalCall,Runtime)對COM Interop接口的方法做什麼? (1)

這只是微軟程序員獲得界面聲明的一個副作用。 一些shell接口在類型庫中是可用的,比如IShellItem,所以最簡單的方法就是運行Tlbimp.exe生成互操作庫和反彙編程序,將程序集反編譯成C#代碼。 這也帶來了Tlbimp.exe生成的額外屬性,如[MethodImpl]。

其他接口在類型庫中不可用,如IShellLinkW和IPeristStream,也不能從IDL生成類型庫,所以程序員別無選擇,只能自己輸入。 他跳過了不必要的東西。

不,[MethodImpl]在這裡不重要。 這些是接口類型,所以沒有辦法。 Tlbimp.exe只是不是非常複雜的。

用於.NET Framework的Windows API代碼包中 ,許多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的一部分。 有趣的是,並不是所有的方法都有MethodImplAttributeIShellFolderIShellLinkW不, IShellLibraryIPersistStream

為什麼MethodImplAttribute應用於一些COM Interop接口? 這在這種情況下意味著什麼,它如何修改interop的行為?





com-interop