如何知道从C ++ dll传递到C#的数组的大小

时间:2012-04-11 05:13:47

标签: c# c++ interop marshalling

实际上我在C#中使用C ++ dll如下

我的C ++代码

extern "C" __declspec(dllexport)
    char**  __stdcall hh()
{
 static char* myArray[3] = {"A1", "BB2", "CC3",};
    return myArray;
}

我的C#代码

[DllImport(@"ourdll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]     
      public static extern IntPtr hh();
       static void Main(string[] args)
        {
            IntPtr a = hh();
            int j = 0;
            string[] s=new string[100]; //I want this to be dynamic
           do
           {
               s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(a,4*j));
               j++;
           }
           while(s[j-1] != null);
        }

我无法获得hh()返回的数组大小;如何获取数组的大小以便我的代码行

string [] s = new string [100]; 改变为 string [] s = new string [ACtual array of array];

3 个答案:

答案 0 :(得分:3)

您要么必须返回数组的大小(可能是引用的变量),要么可以在列表中添加NULL终止符。如果使用NULL终止符,则可以循环遍历数组,直到找到NULL以确定大小。

答案 1 :(得分:1)

如果要在PInvoke中找到数组的长度,可以使用Marshal.SizeOf(object)方法

MSDN Link

它适用于我的结构

答案 2 :(得分:0)

这种类型的数组称为C样式数组,.NET框架的编组服务由于其原始性质而对它的支持有限,因此您应该考虑使用引用参数返回数组的长度(这在Win32 api编程中非常常见,作为示例)。 还要记住,C风格数组的长度根本不是动态的,必须是一个常量表达式,因此hh()函数不会返回任何动态长度值,而只是一个硬编码数据。