2013-10-08 32 views
6

Windows API Code Pack for .NET Framework的COM互操作接口的許多方法與MethodImplAttribute裝飾,例如:MethodImplAttribute(InternalCall,Runtime)對COM Interop接口的方法做什麼?

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.dllshell32.dll不是CLR的一部分。有趣的是,並非所有的方法都有MethodImplAttributeIShellFolder呢,IShellLinkW沒有,IShellLibrary呢,IPersistStream沒有等

爲什麼被應用到一些COM互操作接口MethodImplAttribute?這在這種情況下意味着什麼,它如何修改interop的行爲?

回答

8

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

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

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

相關問題