.NET Framework 用の Windows API コード パックでは、COM 相互運用インターフェイスの多くのメソッドが で装飾されています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 によると、 shell32.dllIShellItem
に実装されています。shell32.dllは CLR の一部ではありません。興味深いことに、すべてのメソッドにMethodImplAttribute
. IShellFolder
する、IShellLinkW
しない、IShellLibrary
する、IPersistStream
しないなど。
MethodImplAttribute
一部の COM Interop インターフェイスにが適用されるのはなぜですか? この場合、それは何を意味し、相互運用の動作をどのように変更しますか?