2012-09-08 3 views
5

Ich habe zwei Schnittstellen in C# definiert ist, wie folgt:C# abgeleitete Schnittstelle kann nicht einwandfrei in C++ arbeiten

[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++ Code, importieren I der TLB von oben Schnittstelle erzeugt folgenden Befehl

#import "device.tlb" raw_interfaces_only 

Die erstellte tlh Datei ist wie folgt:

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

ich erwarte IRADevice von IRADevice leitet sich nicht von IDispa tch und beinhaltet FA-Funktion. Kann mir jemand sagen, wo ich falsch gemacht habe?

+0

Haben Sie versucht, das InterfaceType-Attribut von der abgeleiteten Schnittstelle (IRADevice2) zu entfernen? – alexm

+9

Dies ist eine bekannte Einschränkung der CLR-Unterstützung für COM-Interop. Sie müssen die abgeleitete Schnittstelle reduzieren, wiederholen Sie einfach die Methoden von IRADevice. Setzen Sie sie in die gleiche Reihenfolge, vor den IRADevice2-spezifischen Methoden. –

+0

Ich habe versucht, InterfaceType-Attribut von der abgeleiteten Schnittstelle (IRADevice2) zu entfernen, funktioniert nicht. –

Antwort

2

Wie @HansPassant angegeben, ist dies eine bekannte Einschränkung. Es dauerte eine Minute, aber ich fand einige relevante Dokumente, um diese Tatsache zu unterstützen. http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

Der relevanteste Teil Wesen:

COM-Schnittstellen in C# erklärt Erklärungen für alle Mitglieder ihrer Basis-Interfaces mit Ausnahme von Mitgliedern der IUnknown und IDispatch enthalten muss - das .NET Framework diese automatisch hinzufügt. COM-Schnittstellen, die von IDispatch abgeleitet sind, müssen mit dem InterfaceType-Attribut markiert sein.