gpt4 book ai didi

c# - 如何编码指向结构指针数组的指针?

转载 作者:可可西里 更新时间:2023-11-01 08:44:41 24 4
gpt4 key购买 nike

我有一个具有以下签名的 C 函数:

int my_function(int n, struct player **players)

players 是指向指向 struct player 对象的指针数组的指针。 n 是数组中指针的数量。该函数不修改数组和结构的内容,返回后不保留任何指针。

我尝试了以下方法:

[DllImport("mylibary.dll")]
static extern int my_function(int n,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
player_in []players);

但是,这会将数据编码为指向结构数组的指针,而不是指向结构指针数组的指针。

最佳答案

我相信您必须手动进行一些编码。函数声明应如下所示:

[DllImport("mylibary.dll")]
private static extern int my_function(int n, IntPtr players);

在将其传递给 native 函数之前,我们需要分配一些 native 内存并将结构编码给它:

private static void CallFunction(Player[] players)
{
var allocatedMemory = new List<IntPtr>();

int intPtrSize = Marshal.SizeOf(typeof(IntPtr));
IntPtr nativeArray = Marshal.AllocHGlobal(intPtrSize * players.Length);
for (int i = 0; i < players.Length; i++)
{
IntPtr nativePlayer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Player)));
allocatedMemory.Add(nativePlayer);
Marshal.StructureToPtr(players[i], nativePlayer, false);

Marshal.WriteIntPtr(nativeArray, i * intPtrSize, nativePlayer);
}

my_function(players.Length, nativeArray);

Marshal.FreeHGlobal(nativeArray);

foreach (IntPtr ptr in allocatedMemory)
{
Marshal.FreeHGlobal(ptr);
}
}

如果您的 native 函数要保留并重新使用这些内存位置,这将不起作用。如果是这种情况,要么推迟释放内存,直到您认为它不再被使用,要么在 native 方法中复制传入的数据并让托管端在调用后立即清理其内存。

关于c# - 如何编码指向结构指针数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527014/

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