同一个 COM 库中的 C++ 和 c# 类

Posted

技术标签:

【中文标题】同一个 COM 库中的 C++ 和 c# 类【英文标题】:C++ and c# classes in same COM Library 【发布时间】:2014-03-17 07:06:21 【问题描述】:

在添加新功能时,我正在将现有的 C++ COM 库(STL、Boost 和 ATL)重写为 C#。

但是有几个经过良好测试的大型 C++ 类我宁愿不重写。

从概念上讲(并且为了向后兼容)它们属于同一个 COM 库,但是我可以在 C++ 和 C# 之间划清界限,以便所有交互都通过显式使用 COM 接口。

在同一个库中包含 C# 组件和 C++ 组件的最佳方式是什么?

【问题讨论】:

【参考方案1】:

最好的方法是编写一个用作包装器的 C# COM 库。您正在编写的新 C# COM 库听起来已经可以达到这个目的了。

在这个 C# 库中,您可以放置​​您重写的 C# 代码和您的 C++ 代码的包装版本。至于你如何包装 C++ 代码,你可以在这里做两件事:

在其周围放置一个瘦包装 C# 类,然后将 PInvoke 放入 C++ DLL 中 编写一个 C++/CLI 包装器并以这种方式直接包含您的 C++ 类

第一个允许您继续使用 C# 代码和语法,但在与 C++ 类的交互方面有些限制(您只能访问 DLL 导出中公开的内容)。

第二个迫使你编写一些相当不愉快的 C++/CLI 包装代码,但允许你使用你的 C++ 类的所有荣耀。

此链接here 是为 C++ 库编写 C++/CLI 包装器的非常有用的资源。

【讨论】:

以上是关于同一个 COM 库中的 C++ 和 c# 类的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 C++ 代码中获取对象功能

尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”

C++调用C#dll类库中的方法(非显性COM)

C# 标准库中的 B-tree 类? [关闭]

在 C# 中找不到 C++ COM DLL 中的导出函数

使用 C# 中的 C++ 类