2012-09-08 16 views
5

Tengo dos interfaces definidas en C#, como abajo:C# interfaz derivada no puede funcionar correctamente en C++

código
[Guid("4938540B-3DB2-452c-A061-59EC499657E7")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IRADevice 
{ 
    Void FA(); 
} 

/// <summary> 
/// IRADevice interface represents a given RADevice. 
/// </summary> 
[Guid("4938540B-3DB2-452c-A061-59EC499657E8")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IRADevice2 : IRADevice 
{ 
    void FB(); 
} 

en C++, puedo importar la TLB producido por interfaz anterior usando los siguientes comandos

#import "device.tlb" raw_interfaces_only 

El archivo creado tlh es la siguiente:

struct __declspec(uuid("4938540b-3db2-452c-a061-59ec499657e7")) 
IRADevice : IDispatch 
{ 
// 
// Raw methods provided by interface 
// 

virtual HRESULT __stdcall FA () = 0; 
}; 

struct __declspec(uuid("4938540b-3db2-452c-a061-59ec499657e8")) 
IRADevice2 : IDispatch 
{ 
// 
// Raw methods provided by interface 
// 

virtual HRESULT __stdcall FB () = 0; 
}; 

espero IRADevice deriva de IRADevice no desde IDispa tch, e incluye la función FA. ¿Alguien puede decirme dónde hice mal?

+0

¿Intentó eliminar el atributo InterfaceType de la interfaz derivada (IRADevice2)? – alexm

+9

Esta es una limitación bien conocida en el soporte de CLR para interoperabilidad COM. Necesitarás aplanar la interfaz derivada, simplemente repite los métodos desde IRADevice. Colóquelos en el mismo orden, antes de los métodos específicos de IRADevice2. –

+0

He intentado eliminar el atributo InterfaceType de la interfaz derivada (IRADevice2), no funciona. –

Respuesta

2

Como @HansPassant declaró que esta es una limitación conocida. Me tomó un minuto pero encontré documentación relevante para respaldar ese hecho. http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

La parte más relevante ser: las interfaces

COM declarados en C# debe incluir declaraciones de todos los miembros de sus interfaces base, con la excepción de los miembros de IUnknown y IDispatch - .NET Framework añade automáticamente estos. Las interfaces COM que se derivan de IDispatch se deben marcar con el atributo InterfaceType.

Cuestiones relacionadas