如何从非托管C ++ DLL char **转换为C#字符串并返回

时间:2012-04-11 06:27:39

标签: c# c++ pinvoke

我正在尝试在非托管C ++ DLL上调用函数,搜索stackoverflow帖子我接近但我无法完全工作。

在.h文件中声明如下:

extern int SomeDLLMethod(const char **data, int *count);

数据是一个字符串

我在C#中声明如下:

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(IntPtr data, ref int count);

然后我可以用C#调用它,如下所示:

unsafe
{
    fixed (byte* buffer = new byte[MAX_LENGTH])
    {
        IntPtr ptr = new IntPtr(buffer);
        int count = 0;
        var retVal = SomeDLLMethod(ptr, ref count);
        var dataString = Marshal.PtrToStringAuto(ptr);
        Console.WriteLine(dataString);
     }
 }

调用成功,缓冲区中有计数和数据,但如何将此值读回C#字符串?

元帅方法给我垃圾

1 个答案:

答案 0 :(得分:2)

问题中没有足够的信息可以100%确定,但我的猜测是你需要这个:

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(ref IntPtr data, ref int count);
.....
IntPtr data;
int count;
int retval = SomeDLLMethod(ref data, ref count);
string str = Marshal.PtrToStringAnsi(data, count);

理想情况下,在提出这样的问题时,您应该包含本机功能的完整文档。我这样说是因为char **可能意味着许多不同的东西。

我的假设是这里的char **是指向由DLL分配的以null结尾的C字符串的指针。你的代码假定调用者分配缓冲区,但如果是这样的话,那么我希望看到char *而不是char **。