如何使用原生 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?