2012-09-08 9 views
5

Ho due interfacce definite in C#, come di seguito:C# interfaccia derivato non può funzionare correttamente in C++

codice
[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(); 
} 

in C++, importare il TLB prodotto dalla interfaccia di cui sopra utilizzando seguente comando

#import "device.tlb" raw_interfaces_only 

Il file tlh creato è il seguente:

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

mi aspetto IRADevice deriva da IRADevice non dal IDispa tch e include la funzione FA. Qualcuno può dirmi dove ho sbagliato?

+0

Si è tentato di rimuovere l'attributo InterfaceType dall'interfaccia derivata (IRADevice2)? – alexm

+9

Questa è una ben nota limitazione nel supporto CLR per l'interoperabilità COM. Avrai bisogno di appiattire l'interfaccia derivata, basta ripetere i metodi da IRADevice. Mettili nello stesso ordine, prima dei metodi specifici di IRADevice2. –

+0

Ho provato a rimuovere l'attributo InterfaceType dall'interfaccia derivata (IRADevice2), non funziona. –

risposta

2

Come @HansPassant ha dichiarato che questa è una limitazione nota. Mi ci è voluto un minuto ma ho trovato alcuni documenti rilevanti a supporto di questo fatto. http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

La più rilevante porzione di benessere: le interfacce

COM dichiarati in C# deve includere dichiarazioni per tutti i membri delle loro interfacce di base, ad eccezione dei membri di IUnknown e IDispatch - .NET Framework aggiunge automaticamente questi. Le interfacce COM che derivano da IDispatch devono essere contrassegnate con l'attributo InterfaceType.