2012-09-08 12 views
5

że dwa interfejsy, określone w C#, jak poniżej:C# interfejs pochodne nie mogą działać prawidłowo C++

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

C++ kodu importować TLB wytworzonego przez wyżej interfejsu pomocą polecenie

#import "device.tlb" raw_interfaces_only 

utworzony plik tlh jest jak poniżej:

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

Spodziewam IRADevice wywodzi IRADevice nie od IDispa tch i zawiera funkcję FA. Czy ktoś może mi powiedzieć, gdzie popełniłem błąd?

+0

Czy próbowałeś usunąć atrybut InterfaceType z pochodnego interfejsu (IRADevice2)? – alexm

+9

Jest to dobrze znane ograniczenie w obsłudze CLR dla współdziałania COM. Będziesz musiał spłaszczyć interfejs pochodny, po prostu powtórz metody z IRADevice. Umieść je w tej samej kolejności, przed specyficznymi metodami IRADevice2. –

+0

Próbowałem usunąć atrybut InterfaceType z interfejsu pochodnego (IRADevice2), nie działa. –

Odpowiedz

2

Jak stwierdził @HansPassant, jest to znane ograniczenie. Zajęło mi to chwilę, ale znalazłem odpowiednią dokumentację na poparcie tego faktu. http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

Najistotniejszą część jest: interfejsy

COM zadeklarowane w C# musi zawierać deklaracje dla wszystkich członków ich interfejsów bazowych, z wyjątkiem członków IUnknown i IDispatch - .NET Framework automatycznie dodaje je. Interfejsy COM pochodzące z IDispatch muszą być oznaczone atrybutem InterfaceType.

Powiązane problemy