2012-09-08 25 views
5

我在C#定義兩個接口,如下:C#派生接口可以不是在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++代碼,我使用下面的命令導入通過上述接口所產生的TLB

#import "device.tlb" raw_interfaces_only 

創建的TLH文件如下:

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

我希望IRADevice從IRADevice不是產生於IDispa tch,幷包含FA功能。有人可以告訴我我做錯了嗎?

+0

您是否試圖從派生接口(IRADevice2)中刪除InterfaceType屬性? – alexm

+9

這是CLR對COM互操作支持的一個衆所周知的限制。您需要將導出的接口扁平化,只需重複IRADevice中的方法即可。把它們放在IRADevice2特定方法之前的順序中。 –

+0

我試圖從派生接口(IRADevice2)中刪除InterfaceType屬性,不起作用。 –

回答

2

由於@HansPassant聲稱這是一個已知的限制。它花了我一分鐘,但我發現一些相關的文件來支持這一事實。 http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

最相關的部分是:在C#中聲明必須包含用的IUnknown和IDispatch的成員除外他們的基本接口的所有成員聲明

COM接口 - 在.NET Framework會自動將這些。從IDispatch派生的COM接口必須使用InterfaceType屬性進行標記。