diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index e77c0f61..1ffbc478 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -189,7 +189,15 @@ namespace CppSharp.Generators.CSharp if (Equals(encoding, Encoding.Unicode) || Equals(encoding, Encoding.BigEndianUnicode)) - return string.Format("Marshal.PtrToStringUni({0})", varName); + { + if (Context.Driver.TargetInfo.WCharWidth == 16) + return string.Format("Marshal.PtrToStringUni({0})", varName); + + const string encodingName = "System.Text.Encoding.UTF32"; + return string.Format( + "CppSharp.Runtime.Helpers.MarshalEncodedString({0}, {1})", + varName, encodingName); + } throw new NotSupportedException(string.Format("{0} is not supported yet.", Context.Driver.Options.Encoding.EncodingName)); diff --git a/src/Runtime/Helpers.cs b/src/Runtime/Helpers.cs index 7a3bd791..822fad40 100644 --- a/src/Runtime/Helpers.cs +++ b/src/Runtime/Helpers.cs @@ -1,11 +1,24 @@ using System; using System.Collections.Concurrent; using System.Runtime.InteropServices; +using System.Text; namespace CppSharp.Runtime { public static class Helpers { + public static string MarshalEncodedString(IntPtr ptr, Encoding encoding) + { + var size = 0; + while (Marshal.ReadInt32(ptr, size) != 0) + size += sizeof(int); + + var buffer = new byte[size]; + Marshal.Copy(ptr, buffer, 0, buffer.Length); + + return encoding.GetString(buffer); + } + #if WINDOWS [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl)] #else