¿Cómo declarar e implementar una interfaz COM en C # que hereda de otra interfaz COM?

Estoy tratando de entender cuál es la razón correcta para implementar interfaces COM desde el código C #. Es sencillo cuando la interfaz no hereda de otra interfaz base. Como éste:

[ComImport, Guid("2047E320-F2A9-11CE-AE65-08002B2E1262"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IShellFolderViewCB
{
  long MessageSFVCB(uint uMsg, int wParam, int lParam);
}

Sin embargo, las cosas comienzan a cansarse cuando necesito implementar una interfaz que hereda de otras interfaces COM. Por ejemplo, si implemento elIPersistFolder2 interfaz que hereda deIPersistFolder que hereda deIPersist como generalmente en el código C #:

[ComImport, Guid("0000010c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersist
{
  void GetClassID([Out] out Guid classID);
}

[ComImport, Guid("000214EA-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFolder : IPersist
{
  void Initialize([In] IntPtr pidl);
}

[ComImport, Guid("1AC3D9F0-175C-11d1-95BE-00609797EA4F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFolder2 : IPersistFolder
{
  void GetCurFolder([Out] out IntPtr ppidl);
}

El sistema operativo no puede llamar a los métodos en la implementación de mi objeto. Cuando estoy depurando puedo ver el constructor de miIPersistFolder2 la implementación se llama muchas veces, sin embargo, los métodos de interfaz que he implementado no se llaman. Estoy implementando elIPersistFolder2 como sigue:

[Guid("A4603CDB-EC86-4E40-80FE-25D5F5FA467D")]
public class PersistFolder: IPersistFolder2
{
  void IPersistFolder2.GetClassID(ref Guid classID) { ... }
  void IPersistFolder2.Initialize(IntPtr pidl) { ... }
  void IPersistFolder2.GetCurFolder(out IntPtr ppidl) { ... }
}

Lo que parece extraño es cuando declaro que la interfaz COM importa de la siguiente manera, funciona:

[ComImport, Guid("0000010c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersist
{
  void GetClassID([Out] out Guid classID);
}

[ComImport, Guid("000214EA-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersistFolder : IPersist
{
  new void GetClassID([Out] out Guid classID);
  void Initialize([In] IntPtr pidl);
}

[ComImport, Guid("1AC3D9F0-175C-11d1-95BE-00609797EA4F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersistFolder2 : IPersistFolder
{
  new void GetClassID([Out] out Guid classID);
  new void Initialize([In] IntPtr pidl);
  void GetCurFolder([Out] out IntPtr ppidl);
}

No sé por qué funciona cuando declaro las interfaces COM de esa manera (ocultando los métodos de interfaz base usandonew) Tal vez esté relacionado con la forma en que funciona IUnknown. ¿Alguien sabe cuál es la forma correcta de implementar interfaces COM en C # que hereda de otras interfaces COM y por qué?

Respuestas a la pregunta(1)

Su respuesta a la pregunta