将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?

Posted

技术标签:

【中文标题】将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?【英文标题】:What is the most efficient way of passing a list of objects from c# to poor c++ win32 native dll?将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是什么? 【发布时间】:2015-05-09 12:15:00 【问题描述】:

我需要从 .net 创建一个包含大约 50 000 个元素的列表(数组),将其传递给 c++ dll,对其进行操作并将列表(数组)从 c++ 返回到 .net。

    我想到的第一个选项是在两侧创建一个结构。将结构数组从 .net 返回到 c++。

这是我的担忧:

a) 如果在结构中,它包含非引用类型,例如:int、double 等 具有其值的结构数组将存储在堆栈中吗?

创建结构数组时有限制吗?效率高吗?

在.net端初始化这么大的数组是一种有效的方法吗?

    您是否有任何示例显示如何传递对对象的引用等? 没有 COM、互操作性等?

一般来说,我寻求建议如何有效地执行以下操作:

1) 从数据库中获取数据 2) 将其分配到我可以有效传递给 dll c++ win32 库的结构中 3)在c++端执行操作,然后将数组返回给.net

我还需要一个建议,应该在哪一侧分配/释放对象 在执行上述操作方面..

提前感谢您的帮助

附:我也不明白在课堂上公开数组的信息,每次访问它时都会制作一个完整的副本......有人可以向我解释一下吗?

【问题讨论】:

我认为你想多了。最简单、最有效的方法是将缓冲区和项目数传递给 C++,然后让 C++ 在该缓冲区上工作。如果您需要示例,Windows API 有许多需要用户传递缓冲区和长度的函数。 您有任何示例说明如何在 c# 端使用结构数组准备缓冲区? 我确信有很多示例展示了如何创建一个在对齐、填充等方面与 C# 和 C++ 兼容的结构。只需创建一个数组,然后传递它到 C++ DLL,以及数组中的项目数——基本上与发送 int 或 double 数组没有什么不同。见这里:***.com/questions/10838825/… 你很有帮助。您可以回答该问题,以便我标记为已回答。谢谢 【参考方案1】:

我认为这样做的方法是最简单的,那就是将缓冲区传递给 C++ DLL,以及一个表示项目数的长度参数。这样,客户端负责创建缓冲区而不是 DLL。 DLL 不再负责缓冲区的创建或删除,只负责缓冲区的操作。

这是大多数(如果不是全部)Windows API 函数实现此目的的方式。这些 API 函数中的大多数都处理字符缓冲区,但原理相同。

对于结构,这里有一个链接,描述了如何定义 C# 结构以与 C++(或 C)结构兼容:

Convert C++ struct to C#

【讨论】:

不要说 C++ Win32 很差 :) 没有它 .NET 框架将无法工作。

以上是关于将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

如何将结构数组从 c++ 传递到 c#?

当结构仅在运行时已知时,将结构从 c++ 传递到 c#

将字节数组从 C# 传递到 C++ DLL 作为 char*

如何安全地将字符串引用从 c# 传递到 c++?

在 C# 库和 C++ (CLR) 之间传递对象