C# C派生接口无法在C+中正常工作+;

C# C派生接口无法在C+中正常工作+;,c#,c++,com,interface,import,C#,C++,Com,Interface,Import,我在C#中定义了两个接口,如下所示: [Guid("4938540B-3DB2-452c-A061-59EC499657E7")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IRADevice { Void FA(); } /// <summary> /// IRADevice interface represents a given RADevice. /// </summar

我在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();
}
创建的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,而不是IDispatch,并包含FA函数。有人能告诉我哪里做错了吗?

正如@HansPassant所说的,这是一个已知的限制。我花了一分钟的时间,但我找到了一些相关的文档来支持这一事实

最相关的部分是:


C#中声明的COM接口必须包括其基本接口的所有成员的声明,但IUnknown和IDispatch的成员除外,.NET Framework会自动添加这些声明。从IDispatch派生的COM接口必须标记为InterfaceType属性。

是否尝试从派生接口(IRADevice2)中删除InterfaceType属性?这是CLR支持COM互操作的一个众所周知的限制。您需要展平派生接口,只需从设备重复这些方法。将它们按相同的顺序放在特定于IRADevice2的方法之前。我试图从派生接口(IRADevice2)中删除InterfaceType属性,但不起作用。COM就是这样工作的。必须调用QueryInterface方法才能将IRADevice2强制转换为IRADevice和viceversa。
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;
};