Marshal NOT 0 terminated string

c#, c++, marshalling

Solution

You can change your marshalling to treat the string as a fixed-size array of `bytes`s and then using the `Encoding` class to convert the bytes into a managed string.

i.e

[StructLayout(LayoutKind.Sequential)]
public struct MyManagedStruct_Foo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
    public byte[] product_name;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
    public byte[] product_model;

    public string GetProductName()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_name);
    }

    public string GetProductModel()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_model);
    }
}

Not exactly the sexiest struct in the world, but it should be fine for your needs.

Problem

I have the folowing unmanaged structure. ``` struct MyNativeStruct_Foo { char product_name[4]; char product_model[2]; } ``` And the managed equivalent ``` [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct MyManagedStruct_Foo { [MarshalAs(UnmanagedType.LPStr, SizeConst = 4)] public string product_name; [MarshalAs(UnmanagedType.LPStr, SizeConst = 2)] public string product_model; } ``` Unfortunately the stings are not null terminated. All 4 characters for the product name are used. If I define the managed structure with "LPStr" the string have to be 0 terminated. Is there another way to define the managed structure? It is possible to define a custom Marshaller attribute? Or do you have other Ideas? Note; The native structure can not be changed. Thanks Amberg [EDIT] changed to LPStr (comment Jason Larke)

Original source