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

Posted

技术标签:

【中文标题】从 C# 中的 C++ 代码中获取对象功能【英文标题】:Getting Object Functionality out of C++ code in C# 【发布时间】:2009-04-17 19:51:53 【问题描述】:

我有一个用 C++ 编写的函数,它调用旧库中的一些函数。该函数创建一些内存进行调用并销毁内存。为了优化这一点,我将创建一个对象,该对象将保持分配的内存,直到对象被销毁。但是,我将从 C# 调用此函数,并且不相信我可以导出类,只能导出函数或变量。

我的想法是这样;将 DLL 视为一个类,并在 dll 范围内使用本地变量来指向内存。然后有一个函数来创建内存,调用工作函数和另一个在完成 DLL 后销毁内存。

这是一个好方法吗?有没有更好的办法?

【问题讨论】:

你是在同一个地方创建和销毁内存吗? 【参考方案1】:

我更喜欢在 C++/CLI(以前的托管 C++)中编写托管包装器,因为它可以更轻松地在 C++ 端通过托管/非托管互操作性显式执行您想要的操作,并且您的 C# 不会受到污染带有 P/Invoke 样式代码。

编辑刚刚注意到您的评论“但是我将从 C# 调用此函数并且不相信我可以导出类,只能导出函数或变量。"

这并不完全正确 - C#可以从由 C++/CLI 代码生成的程序集中导入完整的类。

【讨论】:

@Smith325 - 是的。 C++/CLI 是 C++ 的超集(就像 C++ 曾经是 C 的超集一样)。【参考方案2】:

创建一个实现 IDisposable 的 C# 类。你可以在你的 C++ 对象周围包装一个简单的 C API,所以当你构造一个实例时,它会返回一个指向 C++ 类的指针,当你对你的 C# 类进行 Dispose() 时,它会删除指针。

您始终可以取消引用此指针以调用 C++ 类上的方法。

另一个不错的选择是只使用 C++/CLI 为您的 C++ 类创建一个包装器。在那里处理这种情况要简单得多。

【讨论】:

你能提供一些例子的链接吗?例如通过 IDisposable 使用指向 C 类的指针,使用 C++/CLI 制作包装器。 我的博客 (reedcopsey.com/?p=7) 上有第一个示例。任何 C++/CLI 示例都适用于第二个 - 您只需使其成为 C++/CLI 中的托管类,而不是本机 C++ 类。【参考方案3】:

如果您愿意更改原生 C++ 代码,您可以随时将其导出为 C# 可以使用的 COM 接口。

【讨论】:

以上是关于从 C# 中的 C++ 代码中获取对象功能的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 获取非托管 C++ 函数

从 C# 中的 JSON 对象获取对象值

如何在托管代码(C#)中从本机代码(C++)获取字符串数组

如何从非托管 C++ 代码获取结构化列表值到 C#?

C#从返回char指针的c++函数中获取字符串/字符值

从 C++ 库方法返回的“char*”获取 C# 字符串?