I have a binary files that were made with structs. I'm getting this error when trying to write a struct back to the binary file: Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout.
Here's the struct, which should be 2368 bytes. Confirmed this by doing Marshal.SizeOf(typeof(DATA)) and basic math.
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct DATA
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] GD;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Label;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Feat;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Wor;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Source;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Anam;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Crete;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Miss;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Best;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Xware;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] XVersion;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] UncertX;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] UncertY;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] Descrip;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] Discrim;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public char[] Reserved;
}
I made a simple char[] to test:
char[] testArray = new char[] { 'a', 'b', 'c', 'd' };
DATA testStruct = new DATA(); //declare the struct
testStruct.Miss = testArray; //set one of the fields to the char[]
Then I write to the binary file:
using (var fStream = new FileStream(filePath, FileMode.Append))
{
WriteRampToFile(gisDA, fStream );
}
/// <summary>
/// Writes byte array containing a given struct to a file
/// </summary>
public void WriteRampToFile<T>(T str, FileStream fStream )
{
byte[] buffer = GetBytes(str); //puts struct into byte array
fStream .Write(buffer, 0, Marshal.SizeOf(typeof(T))); //write byte array to file
}
/// <summary>
/// Converts the given struct and returns it as a byte array
/// </summary>
/// <param name="str">A structure defined at the top of this file</param>
public byte[] GetBytes<T>(T str)
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
GCHandle h = default(GCHandle);
try
{
h = GCHandle.Alloc(arr, GCHandleType.Pinned);
Marshal.StructureToPtr(str, h.AddrOfPinnedObject(), false); //Error here
}
finally
{
if (h.IsAllocated)
{
h.Free();
}
}
return arr;
}