【问题标题】:C# derived interface cannot work properly in C++C# 派生接口在 C++ 中无法正常工作
【发布时间】: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


【解决方案1】:

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

最相关的部分是:

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

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 2011-08-31
    • 2020-08-01
    • 2013-08-26
    • 2010-11-29
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多