8

.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 インターフェイスにが適用されるのはなぜですか? この場合、それは何を意味し、相互運用の動作をどのように変更しますか?

4

1 に答える 1

11

これは、Microsoft プログラマーがインターフェイス宣言を取得した方法による副作用にすぎません。シェル インターフェイスの一部は、IShellItem などのタイプ ライブラリで使用できるため、それらをソース コードに変換する最も簡単な方法は、Tlbimp.exe を実行して相互運用ライブラリを生成し、逆アセンブラーを実行してアセンブリを C# コードに逆コンパイルすることです。[MethodImpl] など、Tlbimp.exe が生成する追加の属性も取り込まれます。

IShellLinkW や IPersistStream などの他のインターフェイスはタイプ ライブラリでは使用できません。また、IDL からタイプ ライブラリを生成することもできないため、プログラマは自分でそれらを入力するしかありませんでした。彼は不要なものを飛ばした。

いいえ、[MethodImpl] はここでは重要ではありません。これらはインターフェース型なので、とにかくメソッドはありません。Tlbimp.exe はそれほど洗練されたものではありません。

于 2013-10-08T21:05:32.240 に答える