Bug 48429

Summary: Mono fails to marshal fixed buffer fields as unicode
Product: [Mono] Runtime Reporter: Tautvydas Žilys <tautvydas.zilys>
Component: InteropAssignee: Zoltan Varga <vargaz>
Status: RESOLVED FIXED    
Severity: normal CC: masafa, mono-bugs+mono, mono-bugs+runtime
Priority: ---    
Version: master   
Target Milestone: ---   
Hardware: PC   
OS: Windows   
Tags: Is this bug a regression?: ---
Last known good build:

Description Tautvydas Žilys 2016-11-30 16:14:58 UTC
C# code:

unsafe class Program
{
    static void Main(string[] args)
    {
        Buffer b;
        FillBuffer(out b);
        Console.WriteLine(new string(b.characters));
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct Buffer
    {
        public fixed char characters[32];
    };

    [DllImport("TestDll.dll")]
    static extern void FillBuffer(out Buffer buffer);
}

C++ code:

struct Buffer
{
    short characters[32];
};

extern "C" __declspec(dllexport) void FillBuffer(Buffer& buffer)
{
    char str[32] = "this is a real string";
    for (int i = 0; i < 32; i++)
        buffer.characters[i] = str[i];
}

Prints "t" on Mono, prints "this is a real string" on .NET.
Comment 1 Zoltan Varga 2016-12-01 19:53:22 UTC
https://github.com/mono/mono/pull/4072
Comment 2 Zoltan Varga 2016-12-02 17:33:22 UTC
Fixed in mono master eca5dbd482a9f5323a3744b7d2cb2387262b19a8.