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++ dll 的互操作性;从 C# 到 C++ dll 的字符串数组,它设置数据并将其发送回 c#