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

C# derived interface cannot work properly in C++

本文关键字:常工作 工作 派生 接口 C++      更新时间:2023-10-16

我在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是从IRADeview派生的,而不是从IDispatch派生的,并且包括FA功能。有人能告诉我哪里做错了吗?

正如@HansPassant所说,这是一个已知的限制。我花了一分钟的时间,但我找到了一些相关的文件来支持这一事实。http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

最相关的部分是:

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