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

本文关键字:获取 数组 何通过 dll | 更新日期: 2023-09-27 18:08:19

我输出一些东西到用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();
        }
    }
}

再次感谢你。如有任何帮助,不胜感激!

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

这是一个可怕的API。

对于初学者来说,永远不要在本机侧分配内存,如果你不能在本机侧释放内存的话。

但如果你不得不读,那就继续读吧。

修改签名为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),也将是potluck,因为您永远不会清除分配的内存,并且不能保证最后一个元素将是'0

相关文章: