gpt4 book ai didi

c# - 如何通过dll从c#获取c数组?

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:30 26 4
gpt4 key购买 nike

我将一些东西输出到一个用 c 编写的数组,然后我希望通过 dll 从 c# 调用中获取信息,但失败了。没有警告,但我可以注意到正确获取信息。测试代码如下:

@ips存储输出信息

UDPDLL_API int get_by_csharp_tst(char *** ips){
char **ip = NULL;
int i = 0;
*ips = (char**)malloc(sizeof(char*)*10);
if(ips == NULL){
perror("overflow");
}
ip = *ips;
for(i =0 ; i <10 ; i++){
*ip = (char*)malloc(16);
memcpy(*ip,"255.255.255.255",16);
*ip++;
}
return 0;
}

从 c# 调用如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace dll_call
{
class Program
{
[DllImport("udpdll.dll",EntryPoint="get_by_csharp_tst")]
public static extern int get_by_csharp_tst(byte [,] ai);
static void Main(string[] args)
{
int i = 0;
byte[,] ips = new byte[10, 16];
Program.get_by_csharp_tst(ips);
for (i = 0; i < 10; i++) {
Console.WriteLine(ips);
}
Console.Read();
}
}
}

再次感谢。任何帮助将不胜感激!

最佳答案

这是一个糟糕的 API。

对于初学者,永远不要在 native 端分配内存,如果你也不能在那里释放它的话。

但如果必须,请继续阅读。

将签名更改为public static extern int get_by_csharp_tst(out IntPtr[] ai);

这样调用它:

IntPtr[] ai; // do not allocate, you are doing it on the native side already
get_by_csharp_tst(out ai);
// as we know the size, just use it
string[] results = new string[10];
for (int i = 0; i < 10; i++)
{
results[i] = Marshal.PtrToStringAnsi(ai[i], 16);
}
// you need to free the memory you allocated natively here, else memory leak.

foreach (var s in results)
{
Console.WriteLine(s);
}

注意:即使指定长度 (16) 也将是家常便饭,因为您永远不会清除分配的内存并且不能保证最后一个元素是 \0.

关于c# - 如何通过dll从c#获取c数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922903/

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