【发布时间】:2012-09-02 05:32:42
【问题描述】:
我在 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 而不是 IDispatch,并且包含 FA 功能。谁能告诉我哪里做错了?
【问题讨论】:
-
您是否尝试从派生接口(IRADevice2)中删除 InterfaceType 属性?
-
这是 CLR 对 COM 互操作支持的一个众所周知的限制。您需要展平派生接口,只需重复 IRADevice 中的方法。将它们按相同的顺序放在 IRADevice2 特定方法之前。
-
我试图从派生接口(IRADevice2)中删除 InterfaceType 属性,不起作用。
-
这就是 COM 的工作方式。您必须调用 QueryInterface 方法才能将 IRADevice2 转换为 IRADevice,反之亦然。
标签: c# c++ com interface import