gpt4 book ai didi

c# - C++ API 返回一个结构数组

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:17 24 4
gpt4 key购买 nike

我想在我的 C++ API (dll) 中返回一个结构数组。我已经可以返回一个结构并在我的 C# 测试应用程序中使用它。

struct CharacterInformation {
int id;
double x;
double y;
CharacterInformation(int ID, double X, double Y) : id(ID), x(X), y(Y) {}
};

extern "C" EXPORT_API CharacterInformation GetCharacterPositions(void) {
//std::vector<Character> characters = simulator->getCharacters();
//CharacterInformation characterInformationArray [] = { CharacterInformation(0, 1, 2) };
//return characterInformationArray;
CharacterInformation characterInformation = CharacterInformation(0,1,2);
return characterInformation;

}

如何在此函数中传递数组。我必须做一些内存管理,但我不知道我必须做什么。

最佳答案

您不能按照您可能想的那样从函数返回数组,但可以返回指向数组的指针。您还需要返回数组的长度,以便您可以将数据正确编码为适当的 C# 类型。这需要对函数签名稍作更改,以通过传递给函数的参数返回信息。

extern "C" EXPORT_API bool GetCharacterPositions(CharacterInformation** data, int *length)
{
CharacterInformation *characterInformationArray = new CharacterInformation[arraysize];

// initialize contents of array.

// ... snip ...

*length = arraysize;
*data = characterInformationArray;

return true;
}

在这种情况下,您需要将默认构造函数添加到 CharacterInformation 并使用两阶段初始化(即 Init() 函数)。

请注意,您不应返回指向非静态局部变量的指针 引用,因为变量的内容将在超出范围时被销毁(即当函数返回时) .

要编码数据,您可以尝试如下操作。这是未经测试的,但应该会插入您朝着正确的方向前进。

[DllImport("Dllname.dll", 
CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool GetCharacterPositions(out IntPtr arrayPtr, out int size);

public static List<CharacterInformation> GetCharacterPositions()
{
var arrayValue = IntPtr.Zero;
var size = 0;
var list = new List<CharacterInformation>();

if ( !GetCharacterPositions(out arrayValue, out size))
{
return list;
}

var dataEntrySize = Marshal.SizeOf(typeof(CharacterInformation));
for ( var i = 0; i < size; i++)
{
var cur = (CharacterInformation )Marshal.PtrToStructure(arrayValue, typeof(CharacterInformation ));
list.Add(cur);
arrayValue = new IntPtr(arrayValue.ToInt32() + dataEntrySize);
}

return list;
}

您将需要添加一个额外的调用才能正确删除 C++ 中的数据,否则您将以内存泄漏告终。

关于c# - C++ API 返回一个结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16895407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com