uso usar usan una que programacion porque orientada objetos las interfaz interfaces ejemplos definicion como atributos c# .net com com-interop

c# - usar - ¿Qué hace MethodImplAttribute(InternalCall, Runtime) para los métodos de las interfaces COM Interop?



que es una interfaz en programacion orientada a objetos (1)

Es solo un efecto secundario de la forma en que el programador de Microsoft obtuvo la declaración de la interfaz. Algunas de las interfaces de shell están disponibles en una biblioteca de tipos, como IShellItem, por lo que la forma más fácil de acceder al código fuente es ejecutar Tlbimp.exe para generar la biblioteca de interoperabilidad y un desensamblador para descompilar el ensamblado en código C #. Lo cual también trae los atributos adicionales que genera Tlbimp.exe, como [MethodImpl].

Otras interfaces no están disponibles en una biblioteca de tipos, como IShellLinkW e IPeristStream, ni se puede generar una biblioteca de tipos desde el IDL, por lo que el programador no tuvo más remedio que escribirlas en él. Se saltó las cosas innecesarias.

Y no, [MethodImpl] no es crítico aquí. Estos son tipos de interfaz por lo que no hay ningún método de todos modos. Tlbimp.exe simplemente no es muy sofisticado al respecto.

En Windows API Code Pack para .NET Framework , muchos métodos de interfaces COM Interop están decorados con MethodImplAttribute , por ejemplo:

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

La documentación para el valor de MethodImplOptions.InternalCall dice:

La llamada es interna, es decir, llama a un método que se implementa dentro del tiempo de ejecución de lenguaje común.

La documentación de MethodCodeType.Runtime dice:

Especifica que la implementación del método es proporcionada por el tiempo de ejecución.

Pero, si entiendo correctamente, ninguna de las afirmaciones es correcta. IShellItem se implementa en shell32.dll , de acuerdo con MSDN. shell32.dll no es parte de CLR. Lo que es interesante, no todos los métodos tienen el MethodImplAttribute . IShellFolder hace, IShellLinkW no lo hace, IShellLibrary hace, IPersistStream no lo hace, etc.

¿Por qué se aplica MethodImplAttribute a algunas de las interfaces COM Interop? ¿Qué significa en este caso y cómo modifica el comportamiento de interoperabilidad?