gpt4 book ai didi

c# - 将未知大小的结构数组从 c# 传递到 c++ dll 并返回

转载 作者:行者123 更新时间:2023-11-28 07:33:58 25 4
gpt4 key购买 nike

我昨天问了一个类似的问题,但这次略有不同。我在将结构数组从 C# 传递到 C++ 并再次取回时遇到问题。

这是 C++ 代码。首先,结构:

struct Tri
{
public:
int v1, v2, v3;
}

现在是 C++ dll 部分:

extern "C" __declspec(dllexport) void Dll_TriArray(Tri *tri)
{
int num = 10;
tri = new Tri[num];

for (int i = 0; i < num; i++)
{
tri[i].v1 = i + 5;
tri[i].v2 = i + 10;
tri[i].v3 = i + 25;
}
}

这里是 C# 代码,同样从结构开始:

[StructLayout(LayoutKind.Sequential)]
public struct Tri
{
public int v1, v2, v3;
}

public class Testing
{
[DllImport("testing.dll")]
static extern void Dll_TriArray(out Tri[] tryArray);

public GetTriArray()
{
Tri[] triArray;
Dll_TriArray(out triArray);
}
}

所以我在调用 GetTriArray 方法时得到的 triArray 将返回为 null。我考虑过将 IntPtr 作为参数传入,但是如何将 intptr 编码到结构数组中或从中编码?

顺便说一句 - 在这个阶段,我对内存泄漏不感兴趣。

最佳答案

我不是 C# 专家(无论如何),但 C++ 部分被传递了一个指向 Tri-struct 的指针,在 C++ 中它可以像动态数组一样使用,你可以正确分配和填充它,但你没有有办法取回它,因为从 C 的角度来看,您需要修改调用者的 (C#) 指针,但您只会得到一个拷贝,而不是对原始文件的引用。

在 C++ 中,最接近您要做的事情是将原型(prototype)更改为 void Dll_TriArray(Tri *&tri)(通过 ref 调用,而不是通过拷贝调用)但我'我不确定如何将它与 C# 连接(可能是 Dll_TriArray(ref triArray);)。

关于c# - 将未知大小的结构数组从 c# 传递到 c++ dll 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17106423/

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