2013-10-08 10 views
6

In Windows API Code Pack for .NET Framework, molti metodi di interfacce COM interoperabilità sono decorati con MethodImplAttribute, per esempio: valoreCosa fa MethodImplAttribute (InternalCall, Runtime) per i metodi delle interfacce di interoperabilità COM?

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); 

documentazione per MethodImplOptions.InternalCall dice:

La chiamata è interna, cioè, che definisce un metodo che è implementato all'interno del Common Language Runtime.

Documentazione per MethodCodeType.Runtime dice:

Specifica che l'implementazione metodo viene fornito dal runtime.

Ma, se ho capito bene, nessuna delle due affermazioni è corretta. IShellItem is implemented in shell32.dll, secondo MSDN. shell32.dll non è una parte di CLR. Ciò che è interessante, non tutti i metodi hanno il MethodImplAttribute. IShellFolder fa, IShellLinkW non lo fa, IShellLibrary fa, non lo fa IPersistStream ecc

Perché MethodImplAttribute applicata ad alcune delle interfacce COM Interop? Cosa significa in questo caso e in che modo modifica il comportamento di interop?

risposta

8

È solo un effetto collaterale dal modo in cui il programmatore Microsoft ha ottenuto la dichiarazione dell'interfaccia. Alcune delle interfacce shell sono disponibili in una libreria di tipi, come IShellItem, quindi il modo più semplice per ottenerle nel codice sorgente è eseguire Tlbimp.exe per generare la libreria di interoperabilità e un disassemblatore per decompilare l'assembly nel codice C#. Il che porta anche gli attributi extra generati da Tlbimp.exe, come [MethodImpl].

Altre interfacce non sono disponibili in una libreria di tipi, come IShellLinkW e IPersistStream, né una libreria di tipi può essere generata dall'IDL in modo che il programmatore non abbia altra scelta che digitarle in sé. Ha saltato le cose inutili.

E no, [MethodImpl] non è critico qui. Questi sono tipi di interfaccia quindi non esiste comunque alcun metodo. Tlbimp.exe non è molto sofisticato a riguardo.

Problemi correlati