【发布时间】: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++ 是否有帮助??