2013-10-08 8 views
6

In Windows API Code Pack for .NET Framework sind viele Methoden der COM-Interop-Schnittstellen mit MethodImplAttribute zum Beispiel eingerichtet:Was macht MethodImplAttribute (InternalCall, Runtime) für Methoden von COM-Interop-Schnittstellen?

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

Dokumentation für MethodImplOptions.InternalCall Wert sagt:

Der Anruf intern, das heißt, nennt es ein Verfahren das ist in der Common Language Runtime implementiert.

Dokumentation für MethodCodeType.Runtime sagt:

Gibt an, dass das Verfahren die Umsetzung von der Laufzeit zur Verfügung gestellt wird.

Aber, wenn ich richtig verstehe, ist keine Aussage richtig. IShellItem is implemented in shell32.dll, nach MSDN. shell32.dll ist kein Teil von CLR. Was interessant ist, haben nicht alle Methoden die MethodImplAttribute. IShellFolder tut, IShellLinkW nicht, IShellLibrary tut, IPersistStream nicht usw.

Warum MethodImplAttribute einige der COM-Interop-Schnittstellen angewendet wird? Was bedeutet es in diesem Fall und wie verändert es das Verhalten von Interop?

Antwort

8

Es ist nur ein Nebeneffekt von der Art, wie der Microsoft-Programmierer die Deklaration der Schnittstelle erhalten hat. Einige der Shell-Schnittstellen sind in einer Typbibliothek wie IShellItem verfügbar. Daher ist es am einfachsten, Tlbimp.exe zum Generieren der Interop-Bibliothek und einen Disassembler zum Dekompilieren der Assembly in C# -Code zu verwenden. Das bringt auch die zusätzlichen Attribute, die Tlbimp.exe erzeugt, wie [MethodImpl].

Andere Schnittstellen sind nicht in einer Typbibliothek verfügbar, wie IShellLinkW und IPersistStream, noch kann eine Typbibliothek aus der IDL generiert werden, so dass der Programmierer keine andere Wahl hatte, als sie selbst einzugeben. Er übersprang das unnötige Zeug.

Und nein, [MethodImpl] ist hier nicht kritisch. Dies sind Schnittstellentypen, daher gibt es keine Methode. Tlbimp.exe ist einfach nicht besonders raffiniert.