C# 派生接口(interface)在 C++ 中无法正常工作

标签 c# c++ com interface import

我在 C# 中定义了两个接口(interface),如下所示:

[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++ 代码中,我使用以下命令导入由上述接口(interface)生成的 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 函数。谁能告诉我哪里做错了?

最佳答案

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

最相关的部分是:

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

关于C# 派生接口(interface)在 C++ 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333246/

相关文章:

c++ - 是否有任何将资源嵌入 Linux 可执行镜像的标准方法?

c# - 生成的.TLB文件输出目录

.net - 使用 native DLL 从同一文件夹加载程序集

c# - 使用 foreach 遍历通用列表

c# - 创建一个 IEqualityComparer<IEnumerable<T>>

C++ 语法错误 : Getting several errors expecting ';'

c++ - 如何在 std::pair 中返回 std::lock_guard

C# - 禁用日期 JSON 的自动 UTC 偏移

c# - 如何以编程方式 "unbind"套接字?

c# - 如何访问从经典 ASP JScript 中的 CSharp COM 对象返回的集合?