I use to use this way call functions with pointer to pointer arguments. This may good for your function also.
The string and the string list would be used with int pointers:
public static extern void GetData( System.IntPtr name, System.IntPtr address, ref Int32 Size)
before call alloc name:
IntPtr name = Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * <maxsize>);
then call:
GetData(ref name, ref address, ref Size);
you can get the Name and Address like this way:
string Name = GlobalMarshaller.StringFromIntPtr(name);
string[] Adress = GlobalMarshaller.StringFromIntPtr(address, <maxcount>, <maxsize>);
Then clean up!
Marshal.FreeHGlobal(name);
Marshal.FreeHGlobal(adress);