public object MarshalNativeToManaged(IntPtr nativeData)
        {
            List <string> values = new List <string>();

            if (nativeData != IntPtr.Zero)
            {
                IntPtr arrayIndex = nativeData;

                while (true)
                {
                    IntPtr stringPointer = Marshal.ReadIntPtr(arrayIndex);

                    if (stringPointer == IntPtr.Zero)
                    {
                        break;
                    }

                    string value = Utf8Marshal.PtrToStringUtf8(stringPointer);

                    if (value == string.Empty)
                    {
                        break;
                    }

                    values.Add(value);
                    arrayIndex += IntPtr.Size;
                }
            }

            return(new ReadOnlyCollection <string>(values));
        }
        public object MarshalNativeToManaged(IntPtr nativeData)
        {
            // Get the the size of the string
            string value = Utf8Marshal.PtrToStringUtf8(nativeData);

            return(value);
        }
        public IntPtr MarshalManagedToNative(object managedObj)
        {
            var values = managedObj as ReadOnlyCollection <string>;

            if (values == null)
            {
                return(IntPtr.Zero);
            }

            IntPtr[] unmanagedArray = new IntPtr[values.Count + 1];

            for (int i = 0; i < values.Count; i++)
            {
                unmanagedArray[i] = Utf8Marshal.StringToHGlobalUtf8(values[i]);
            }

            unmanagedArray[values.Count] = IntPtr.Zero;

            IntPtr unmanagedData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)) * unmanagedArray.Length);

            Marshal.Copy(unmanagedArray, 0, unmanagedData, unmanagedArray.Length);

            return(unmanagedData);
        }