c++ 结构指针转换为数组互操作 c#

Posted

技术标签:

【中文标题】c++ 结构指针转换为数组互操作 c#【英文标题】:c++ structure pointer cast as array interop c# 【发布时间】:2017-09-27 12:06:22 【问题描述】:

前言

我有一个带有 COM 组件的旧版 c++ 应用程序。其中一种方法是

HRESULT foo(int* returnInteger)

虽然最初的实现被设计为返回单个 int,但程序的演变使得实现它的类现在返回一个整数列表而不是一个。

returnInteger = memalloc((number of integers)*size of integer)

调用者也通过

读取返回指针
number of integers returned = sizeof(returnInteger)/size of integer

我知道这种设计不是纯 COM,不理想,并且在设计时没有考虑到互操作性。但是,我必须用我拥有的东西凑合。

当前问题

设计一个使用该组件的 c# 应用程序。我知道我将不得不慢慢淘汰它,但现在,我必须继续这样做

c# 将方法显示为

foo(ref int returnInteger)

c# 应用程序将只读取一个 int(即使 c++ 客户端通过整数数组发送)。如何让 c# 应用程序的行为与 c++ 客户端相同并读取整数数组?

非常感谢任何帮助

【问题讨论】:

使用 BitConverter。 BitConverter 将允许您一次将 4 个字节转换为整数,并具有一个起始索引,您可以转换数组中的任何 4 个连续字节。指针成为起始索引。 @jdweng 感谢您的即时回复。抱歉有点厚,但我无法弄清楚 bitconverter 将如何帮助我。我已经编辑了这个问题,希望这能更清楚地传达我的问题。如果还是要BitConverter,能不能也提供个代码sn-p? 当函数声明完全无法返回多个 int 时,很难为您提供帮助。至少它应该是 int** 以便它可以返回一个数组,加上一个 int* 参数来返回数组大小。只要您必须修复代码,就以正确的方式进行操作并返回 SafeArray。 @HansPassant 这就是我害怕的。由于我无法更改遗留代码,我想知道一层托管 C++ 是否有帮助?? 【参考方案1】:

找到了解决方法:使用托管 C++ 作为中间层。

虽然不是最理想的解决方案,但由于无法修改遗留代码,这是我最喜欢的路线。

非常感谢大家的帮助

【讨论】:

如果你声明参数 IntPtr 然后使用 marshal 方法,你可以让它在没有中间层的 c# 中工作。

以上是关于c++ 结构指针转换为数组互操作 c#的主要内容,如果未能解决你的问题,请参考以下文章

通过互操作将字符串数组从 C# 传递到 C++

互操作 C++ 时释放分配的内存

C# ArrayList 与 C++ 互操作

字符串数组 C# 与 C++ dll 的互操作性;从 C# 到 C++ dll 的字符串数组,它设置数据并将其发送回 c#

C# 和 C++ 互操作

互操作:具有 C# COM 服务器字节数组参数的 C++ COM 客户端 - 数组是复制入/出还是直接访问?