如何使用原生 C++ 的 COM 实现 C# 的接口?

Posted

技术标签:

【中文标题】如何使用原生 C++ 的 COM 实现 C# 的接口?【英文标题】:How to implement interface of C# use COM of native C++? 【发布时间】:2016-12-13 02:33:47 【问题描述】:

我在跨平台使用 .Net Core,包括 windows 和 linux。

我不能使用 ATL。

我嵌入了。 Net core 到我的可执行程序。

我希望将 c++ 类实例指针暴露给 .Net Core(C#),并转换为 C# 的接口。

C++:

class foo : public IDispatch, public IManagedObject, public IInspectable... fobj;
extern "C" __declspec(dllexport) foo* WINAPI GetTestObject()return new foo;

C#:

[DllImport("foo.dll")]
static extern IntPtr GetTestObject();
[Guid("48DF8E89-57DE-3599-AD7C-B49500EF01C0")]
interface ITest

    int func();

main()
    var v = GetTestObject();
    obj = (ITest)Marshal.GetObjectForIUnknown(v);
    obj.func();// exception
    dynamic dobj = Marshal.GetObjectForIUnknown(v);
    dobj.func();// OK, IDispatch::Invoke be called

我希望实现C#的接口ITest。

【问题讨论】:

将[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]添加到ITest,ok,调用IDispatch::Invoke。 【参考方案1】:

您需要的是Runtime callable wrapper。

这是一个How to article,介绍如何创建一个。

【讨论】:

【参考方案2】:

[接口类型(ComInterfaceType.InterfaceIsIDispatch)]

接口测试

【讨论】:

以上是关于如何使用原生 C++ 的 COM 实现 C# 的接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# BackgroundWorker 报告本机 C++ 代码的进度?

从本机 C++ 调用 C#,而不使用 /clr 或 COM?

从 C++ 原生插件更新浮点数组

如何通过 Visual Studio COM 包装器(或其他方式)在 C# 中使用 C++ 属性联合

创建要在 C# 中使用的托管 C++ 接口

如何使用 C++ 封装的 COM 接口部署 C# 库?